-3

如果您对为该对象使用继承不感兴趣,那么在 JavaScript 中为该对象使用 Prototype 函数有什么意义?

换句话说,Prototype 函数除了实现继承机制还有其他用途吗?

4

2 回答 2

2

... Prototype 函数除了实现继承机制还有其他用途吗?

我假设您的意思是对象的prototype属性。Function(JavaScript 中没有“原型函数”。)

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

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

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

请注意,现在我们有了 ECMAScript5,您可以在不使用构造函数的情况下分配原型,如果您愿意,可以使用 new 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

于 2013-10-13T14:40:55.450 回答
0

与经典继承(如 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,它没有类或继承,它是一种原型语言。

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

于 2013-10-13T14:47:49.653 回答