原型函数 JavaScript

Prototype function JavaScript

本文关键字:JavaScript 函数 原型      更新时间:2023-09-26

如果你对一个对象使用继承没有兴趣,那么在JavaScript中对一个对象使用Prototype函数有什么意义吗?

换句话说,Prototype 函数除了实现继承机制之外还有什么目的吗?

。原型函数除了实现继承机制之外,是否有其他目的?

我假设你的意思是Function对象的prototype属性。(JavaScript中没有"原型函数"。

这取决于你所说的"继承"是什么意思。Function 实例上的 prototype 属性的目的是指定将分配为使用该函数作为构造函数创建的对象的原型的对象,例如:

var f = new Foo(); // Assigns `Foo.prototype` as `f`'s prototype

这样,f可以访问该原型定义的属性。如果这就是你所说的继承,那么是的,这是函数上prototype属性的唯一目的。

请注意,现在我们有 ECMAScript5,如果你愿意,可以使用新的Object.create来分配原型而不使用构造函数:

var f = Object.create(somePrototype); // Assigns `somePrototype` as `f`'s prototype

以下是两者的更具体示例:

使用构造函数:

function Foo(name) {
    this.name = name;
}
Foo.prototype.hey = function() {
    console.log("Hi, I'm " + this.name);
};
var f = new Foo("Fred"); // Assigns `Foo.prototype` as `f`'s prototype
f.hey();                 // Shows "Hi, I'm Fred" because `f` gets `hey` from its prototype

使用Object.create

var fproto = {
    hey: function() {
        console.log("Hi, I'm " + this.name);
    }
};
var f = Object.create(fproto); // Assigns `fproto` as `f`'s prototype
f.name = "Fred";
f.hey();                       // Shows "Hi, I'm Fred" because `f` gets `hey` from its prototype

因此,如果您只想使用 Object.create ,并且只使用支持 ES5 的引擎,那么如果您愿意,您永远无法使用Function#prototype

与经典继承(如Java)不同,它允许您访问父级的属性。

例如:

var criminal = {
           'name': 'John',
           'crime': 'Murder'
           }
criminal.name; // 'John'
var criminal2 = Object.create(criminal);
criminal2.prison = 'Famous Prison';
criminal2.name; // 'John'
criminal2.name = 'Tom';
criminal2.name; // 'Tom'

如果这有任何意义。不过,我对Java的比较可能是错误的。

此外,你认为JavaScript是另一种语言。事实并非如此。它是JavaScript,它没有类或继承,它是一种原型语言。

你应该看看 JavaScript: The Good Parts by Crockford