为什么原型在简单 JavaScript 对象中不可用
Why prototype is not available in simple JavaScript object
我正在尝试理解 JavaScript 原型,我有点担心 confused.There 那里有大量的教程,每个教程都有不同的解释。所以我不知道从哪里开始。
到目前为止,我已经创建了一个简单的 JavaScript 对象
var a = {flag : 1}
在MDN,我读到
All objects in JavaScript are descended from Object
但是我找不到这个对象的原型 a a.prototype
给我 undefined
然后我发现原型在 a.constructor.prototype
中可用。当我创建一个函数时 var myfunc = function() {}
然后 myfunc.prototype
可用。因此原型 属性 可直接用于函数而不是对象。
请帮助我理解这个和那个是什么a.constructor
。
非常感谢任何帮助。
您可以使用 Object.getPrototypeOf()
代替 return 您是 Object
的原型。
要在您的浏览器开发工具中查看此内容,运行以下内容:
var a = {flag: 1};
console.dir(Object.getPrototypeOf(a));
每个函数都可以作为构造函数调用(使用 new
关键字)。
function Dog() {
this.legs = 4;
}
当您将其作为普通函数调用时,var dog = Dog()
,它将在浏览器中将 window.legs
定义为 4
(如果在 Node.JS), 并将 dog
设置为 undefined
.
但是,如果你调用它作为构造函数,如var dog = new Dog()
,它会创建一个新对象,并将其constructor
设置为这个函数,并将这个新对象赋值给dog
.它将其内部原型(可以在某些浏览器中作为dog.__proto__
访问)设置为构造函数的原型(Dog.prototype
)。或者,在伪代码中,
var dog = {
legs: 4
};
dog.constructor = Dog;
dog.__proto__ = Dog.prototype; // same as dog.constructor.prototype
因此,dog.constructor.prototype
严格来说并不是dog
的原型,而是构造函数为运行时将赋值给原型的对象。特别是,Dog.prototype
是 而不是 函数的 Dog
原型(只是其实例将获取的原型)。 prototype
在非函数上不可用的原因是因为非函数不能用作构造函数,所以拥有它是没有意义的(因为它的唯一功能是被复制到构造实例对象' __proto__
).
你例子中的对象仍然有一个原型,但不能直接访问;你可以在允许它的浏览器中走 hacky 路线 (a.__proto__
),或者很好地询问浏览器 (Object.getPrototypeOf(a)
)。
我正在尝试理解 JavaScript 原型,我有点担心 confused.There 那里有大量的教程,每个教程都有不同的解释。所以我不知道从哪里开始。
到目前为止,我已经创建了一个简单的 JavaScript 对象
var a = {flag : 1}
在MDN,我读到
All objects in JavaScript are descended from Object
但是我找不到这个对象的原型 a a.prototype
给我 undefined
然后我发现原型在 a.constructor.prototype
中可用。当我创建一个函数时 var myfunc = function() {}
然后 myfunc.prototype
可用。因此原型 属性 可直接用于函数而不是对象。
请帮助我理解这个和那个是什么a.constructor
。
非常感谢任何帮助。
您可以使用 Object.getPrototypeOf()
代替 return 您是 Object
的原型。
要在您的浏览器开发工具中查看此内容,运行以下内容:
var a = {flag: 1};
console.dir(Object.getPrototypeOf(a));
每个函数都可以作为构造函数调用(使用 new
关键字)。
function Dog() {
this.legs = 4;
}
当您将其作为普通函数调用时,var dog = Dog()
,它将在浏览器中将 window.legs
定义为 4
(如果在 Node.JS), 并将 dog
设置为 undefined
.
但是,如果你调用它作为构造函数,如var dog = new Dog()
,它会创建一个新对象,并将其constructor
设置为这个函数,并将这个新对象赋值给dog
.它将其内部原型(可以在某些浏览器中作为dog.__proto__
访问)设置为构造函数的原型(Dog.prototype
)。或者,在伪代码中,
var dog = {
legs: 4
};
dog.constructor = Dog;
dog.__proto__ = Dog.prototype; // same as dog.constructor.prototype
因此,dog.constructor.prototype
严格来说并不是dog
的原型,而是构造函数为运行时将赋值给原型的对象。特别是,Dog.prototype
是 而不是 函数的 Dog
原型(只是其实例将获取的原型)。 prototype
在非函数上不可用的原因是因为非函数不能用作构造函数,所以拥有它是没有意义的(因为它的唯一功能是被复制到构造实例对象' __proto__
).
你例子中的对象仍然有一个原型,但不能直接访问;你可以在允许它的浏览器中走 hacky 路线 (a.__proto__
),或者很好地询问浏览器 (Object.getPrototypeOf(a)
)。