2013-03-07 107 views
6

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

因此,基于上述情况,可以说只有函数对象(构造函数版本)而不使用对象文字才能说继承(它使用原型属性)?

此外,添加的__proto__属性是不是在所有的浏览器访问...

+1

您不能更改现有对象的原型或使用对象文本时指定的原型,所以,如果我正确地理解你的问题,我会说是的。 – 2013-03-07 06:53:37

+0

因此,这将涉及到大多数的浏览器行为(除了少数像Firefox一样可以设置“__proto__”链接)...所以可以说继承可以使用Object literal来实现(但只能在浏览器中允许设置__proto__链接,就像Firefox)? – testndtv 2013-03-07 07:00:38

+0

对象文字本身从Object.prototype继承,所以你仍然获得继承,但是当你使用类似于构造函数的文字语法时,你现在不能设置更长的原型链。而构造函数并不是唯一的方法。您可以改为使用Object.create。 – 2013-03-07 07:08:11

回答

2

短版

是:原型链不能被分配到建立或修改对象的prototype属性。你不能通过创建一个带有对象字面值的对象来设置继承,然后给它一个名为prototype的属性。这种财产将被称为prototype,但不会被视为原型继承。

长:

如果你访问一个属性,它是undefined,该对象的继承链中被选中。所以,如果obj['prop']undefined,那么将检查obj.prototype['prop']。在许多浏览器中,prototype属性在内部实现为__proto__属性,但除此之外,该属性不在此限。相反,重点是如果某个属性为undefined,则检查该对象的原型是否属于该属性。

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

但是,构造函数调用产生的对象的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