Javascript继承和对象文字

时间:2013-03-07 06:50:21

标签: javascript jquery oop prototypal-inheritance

在JavaScript中,据说对象文字有原型链接,但是 函数对象具有原型链接和原型属性。

那么,基于上面的说法,可以说继承(使用prototype属性)只能用于函数对象(构造函数版本)而不能用于对象文字吗?

另外,要添加,所有浏览器都无法访问__proto__属性...

1 个答案:

答案 0 :(得分:2)

简短版

是:通过分配对象的prototype属性,无法设置或修改原型链。您不能通过创建具有对象文字的对象然后为其提供名为prototype的属性来设置继承。这样的属性将被称为prototype,但不会被视为原型继承。

更长:

如果访问undefined的属性,则会检查该对象的继承链。因此,如果obj['prop']undefined,则会检查obj.prototype['prop']。在许多浏览器中,prototype属性在内部实现为__proto__属性,但除此之外。相反,关键是如果某个属性为undefined,则会检查对象的原型是否属于该属性。

正如人们在评论中所说的那样,只有通过将该对象赋值给函数的prototype属性,然后将该函数用作构造函数,才能赋予对象一个提供上述继承的原型。

但是,构造函数invokation生成的对象的prototype属性不是object.hasOwnProperty('prototype')。另一方面,如果您为对象分配prototype属性,那么该对象将object.hasOwnProperty('prototype'),但object.prototype将与原型链无关 - 它只会成为常规财产,并且恰好打电话给prototype

为了证明这一点:

var foo = {};
foo.prototype = {bar: 'hello'};
console.log(foo.bar); // undefined
console.log(foo.prototype); // Object {bar: "hello"}
console.log(foo.hasOwnProperty('prototype')); // true

var Foo = function() {};
Foo.prototype = {bar: 'hello'};
var f = new Foo;
console.log(f.bar); // 'hello';
console.log(f.hasOwnProperty('bar')); // false
console.log(f.prototype); // undefined
console.log(f.hasOwnProperty('prototype')); // false