如果您对为该对象使用继承不感兴趣,那么在 JavaScript 中为该对象使用 Prototype 函数有什么意义?
换句话说,Prototype 函数除了实现继承机制还有其他用途吗?
如果您对为该对象使用继承不感兴趣,那么在 JavaScript 中为该对象使用 Prototype 函数有什么意义?
换句话说,Prototype 函数除了实现继承机制还有其他用途吗?
... 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
。
与经典继承(如 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 。