Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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_Undefined_New Operator_Prototypal Inheritance - Fatal编程技术网

Javascript 为什么函数响应原型,而常规对象不响应?

Javascript 为什么函数响应原型,而常规对象不响应?,javascript,prototype,undefined,new-operator,prototypal-inheritance,Javascript,Prototype,Undefined,New Operator,Prototypal Inheritance,考虑: function Foo() {} var x = new Foo(); 现在x和Foo具有相同的原型,但只有Foo响应。原型: Object.getPrototype(x) === Foo.prototype // true x.prototype === Foo.prototype // false Foo.prototype // Foo {} (depending on which browser) x.prototype // undefined 为什么x.prototy

考虑:

function Foo() {}
var x = new Foo();
现在x和Foo具有相同的原型,但只有Foo响应。原型:

Object.getPrototype(x) === Foo.prototype // true
x.prototype === Foo.prototype // false

Foo.prototype // Foo {} (depending on which browser)
x.prototype // undefined

为什么
x.prototype
不起作用,但是
Foo.prototype
起作用?

prototype
是构造函数的一个属性,它决定了该构造函数创建的新对象的原型是什么。只有在构造函数上有这样的属性才有用

只要构造器上的原型没有改变:

Object.getPrototypeOf( x ) === Foo.prototype
这与:

Object.getPrototypeOf( x ) === x.constructor.prototype
请注意,一般而言:

Object.getPrototypeOf( Foo ) != Foo.prototype

长话短说:用于
new
的函数有
prototype
,而对象实例没有

我可能无法准确地说出这一点,但是
原型
仅适用于您可能称之为构造函数的函数,这些函数将通过
新建
来创建实例。可以将原型视为结果实例的模板

对于结果对象,
prototype
不是属性。相反,构造函数原型中的属性可以作为创建的实例的属性使用。这意味着,当您在实例上查找一个属性时,如果它没有在实例上定义,Javascript将开始检查原型链,看看它是否在那里定义

如果要访问实例的原型,请使用


Javascript的语义可能令人困惑。我强烈建议通过免费阅读来彻底理解Javascript的一些优点。第8章正是关注这个主题。

x.constructor.prototype==Foo.prototype
实际上
x
Foo
没有相同的原型:
Foo
的原型是
函数。prototype
。你有很好的答案,对“javascript原型链”的一些研究应该会对你有所帮助。最后一行似乎最有帮助,特别是
Foo.prototype
不是Foo的原型,而是用Foo构建的对象的原型。我有这个权利吗?