2014-02-18 32 views
-2

我试图创建对象不同的方式,并试图观察以各种方式创建的对象的原型属性。“原型”属性不适用于所有的对象创建方式

var a = {a: 1}; 
//The prototype chain as mentioned in [here][1] 
// a ---> Object.prototype ---> null 

现在,我观察到a.prototype是未定义的。 问题1:如果未定义,那么原型链是如何形成的? a.hasOwnProperty因为原型链而存在。

现在,如果我说:

var myFunc = function(){}; 
// Prototype chain: myFunc ---> Function.prototype ---> Object.prototype ---> null 

创造的这种方式,myFunc.prototype存在。

问题2:为何存在这种差异?

+1

'prototype'是一个只有函数才有的特殊属性。 –

+0

构造函数具有原型,您可以使用Object.create创建一个(空或第二个参数)对象与传递的对象(第一个参数)作为用于查找原型链的第一个原型。更多关于这是如何工作的:http://stackoverflow.com/a/16063711/1641941 – HMR

回答

2

prototype属性不是对象的原型。这是(通常)__proto__属性,虽然我不认为任何版本的ECMAScript标准都需要该属性。函数Fooprototype属性是将用作由new Foo()生成的对象的原型的对象。

+0

尽管'.__ proto__'在大多数浏览器中都被弃用,我相信ES6会加入对该属性的全面支持,作为一个神奇的(可变的)的getter/setter。 – Norguard