Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么是JS函数';s的原型属性用于?_Javascript_Prototypal Inheritance - Fatal编程技术网

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
属性是函数实例的属性”是对象实例(可能由函数创建,也可能不是由函数创建)。公平地说,它仍然是非标准的:)是。不推荐使用,不推荐使用