Javascript 什么是JS函数';s的原型属性用于?
我通过Javascript 什么是JS函数';s的原型属性用于?,javascript,prototypal-inheritance,Javascript,Prototypal Inheritance,我通过\uuu proto\uu属性了解javascript原型继承。但是我注意到,当我执行var f=function(){}f时,除了\uuu proto\uu属性之外,现在还有一个prototype属性。似乎prototype不参与属性链接。它具体做什么?它被指定为通过new关键字使用该函数创建的对象的原型 例如: function Foo() { } Foo.prototype.bar = 47; var obj = new Foo(); alert(obj.bar); // aler
\uuu proto\uu
属性了解javascript原型继承。但是我注意到,当我执行var f=function(){}
f时,除了\uuu proto\uu
属性之外,现在还有一个prototype
属性。似乎prototype
不参与属性链接。它具体做什么?它被指定为通过new
关键字使用该函数创建的对象的原型
例如:
function Foo() {
}
Foo.prototype.bar = 47;
var obj = new Foo();
alert(obj.bar); // alerts 47, via `obj`'s prototype
obj
和分配给Foo.prototype
的对象之间的引用是活动的,因此向Foo.prototype
添加更多内容将使它们显示在obj
的原型上:
Foo.prototype.charlie = 62;
alert(obj.charlie); // alerts 62
当然,如果您替换Foo.prototype
(我不鼓励这样做),那么您将Foo.prototype
指向不同的对象<代码>obj仍将引用旧的:
Foo.prototype = {delta: 77}; // Not recommended
alert(obj.delta); // alerts "undefined"
关于
\uuuu proto\uuuu
:\uuuu proto\uuuu
是非标准的。在此之前(只有一年半的历史),没有直接与对象原型交互的标准方式,只能在对象创建时分配它们,只能通过构造函数的prototype
属性间接分配\uuuu proto\uuuu
是一些JavaScript引擎(最著名的是Mozilla的SpiderMonkey,Firefox中的引擎)中的专有扩展。它不在任何标准中,而且根据ECMAScript委员会的说法,它不会。(相反,ECMAScript 5提供了与对象原型交互的函数。)由Mozilla提供。属性是对象的实例的属性(在本例中,对象是函数),它引用实例的原型。您应该注意,此属性是非标准且已折旧的,请改用Object.getPrototypeOf(ref)
:
相比之下,prototype
是函数声明(而不是实例)的属性,是函数所有实例的原型。查看文档:
创建函数的新实例时(使用new
关键字),将创建一个函数对象,如原型所定义。实例化后(var myNewObject=newfoo()
),调用Object.getPrototypeOf(myNewObject)
将返回对实例所基于的原型的引用
总而言之:\uuu proto\uuu
是某物的本来面目,prototype
是某物可以是(或可能已经是)的本来面目。当您将函数作为构造函数调用时,返回对象的\uu proto\uu
属性引用函数的prototype
对象。“the\u proto\u
属性是函数实例的属性”是对象实例(可能由函数创建,也可能不是由函数创建)。公平地说,它仍然是非标准的:)是。不推荐使用,不推荐使用