Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.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原型链接和委托是如何工作的?_Javascript_Prototype_Delegation - Fatal编程技术网

Javascript原型链接和委托是如何工作的?

Javascript原型链接和委托是如何工作的?,javascript,prototype,delegation,Javascript,Prototype,Delegation,为什么func.foo无法查找prototype属性 function func() {} func.prototype.foo = "Var" console.log(func.foo) // undefined var foonew = new func() console.log(foonew.foo) // Var 当使用proto引用原型时,其行为看起来是相反的。您将[[prototype]]与原型混为一谈 [[Prototype]],也称为\uuuu proto\uuu,

为什么func.foo无法查找prototype属性

function func() {}

func.prototype.foo = "Var"

console.log(func.foo) // undefined

var foonew = new func() 

console.log(foonew.foo) // Var

当使用proto引用原型时,其行为看起来是相反的。

您将[[prototype]]与
原型混为一谈

[[Prototype]],也称为
\uuuu proto\uuu
,是一个内部属性,用于确定当前对象应从哪个对象继承

prototype
是构造函数的一个属性,它决定了新创建实例的[[prototype]]

这一点在本文中有充分的解释

通过将构造函数的[[Prototype]]设置为其
Prototype
,可以实现这两种行为。您可以使用
setPrototypeOf
(或
\uuuuuuuuuuuuuuuuuuuuuuuu
)实现以下目的:

function func() {}

func.__proto__.foo = "Var"

console.log(func.foo) // Var

var foonew = new func() 

console.log(foonew.foo) // undefined

不过我不推荐。

@Vohuman。我不想比较原型和原型的属性。我试图理解为什么某个特定的查找不起作用。@Vohuman linked的问题和公认的答案清楚地解释了为什么第一次查找失败。它还隐式地解释了为什么不应该修改
\uuuuu proto\uuuuu
,这解释了第二次查找。
function func() {}
Object.setPrototypeOf(func, func.prototype);
func.prototype.foo = "Var";

func.foo;       // "Var"
new func().foo; // "Var"