原型函数JavaScript

时间:2013-10-13 14:26:24

标签: javascript

如果你没有兴趣为该对象使用继承,那么在JavaScript中使用Prototype函数是否有任何意义?

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

2 个答案:

答案 0 :(得分:2)

  

... Prototype函数除了实现继承机制之外还有其他目的吗?

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

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

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

答案 1 :(得分:0)

与经典继承(Like 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:好的部分