函数对象原型
这个问题在这里已经有了答案:
原型只不过是实例继承属性的对象。
因此, funcObj
是另一个原型( Function
的一个)的实例,它从中继承了所有的属性。 另外,它本身也有一个prototype
,你可以在其上绑定任何你想要的原型,并且一旦你调用它来构造funcObj
新实例,就会使用原型(也就是说,当你将它和new
keywork一起调用时,就像new funcObj()
)。
因此, funcObj
没有叫做greet
的成员,而它的实例拥有它是funcObj
。
因为该函数是与实例不同的对象。
将属性放在一个对象上不会影响任何其他对象; 甚至没有那个对象或原型是一个实例的函数。
就像一个class Foo
本身不是同一类型的new Foo
,没有理由Foo
拥有分配给任何属性Foo.prototype
。 原因有一点不同,但考虑用另一种语言如java,很明显,你试图做的事情不应该工作:
class Foo {
public String bar = "analogous to Foo.prototype.bar which is a property of Foo instances";
}
class Baz {
String thisMethodShouldAndWillFail() {
return Foo.bar;
}
String thisIsWhatShouldAndWillWork() {
return (new Foo()).bar;
}
}
在JavaScript中,你需要纠正你对原型是什么以及它如何与对象和构造函数相关的想法,否则你会不断遇到问题。 foo
有一个原型,但该原型不是foo.prototype
。 foo
本身没有属于它的原型。 foo
的原型由其构造函数Foo
确定; 这样做更有意义,因为您可以在foo.prototype
后将任何旧值赋值给foo.prototype
,从而将foo
转换为未初始化的类的实例。
构造函数Foo
同样没有任何意义,如果它将作为它定义的类的实例; 它本身并未初始化,因此不能安全地假定它将实现为其实例设计的行为。 Foo
是Function
一个实例,因为它可以被调用,所以它是有意义的。 因此Foo
的原型是Function.prototype
,而不是Foo.prototype
。
当您调用foo = new Foo
时,将创建foo
和其原型之间的关系。 由于构造函数Foo
的主体有望初始化实例,因此这是赋予foo
其原型的唯一有意义的时间。 原型提供了一个对象它的共同行为,构造函数初始化对象,以便这些行为将按预期工作。 当通过new Foo
构建时,赋予foo
的原型不是别的,而是Foo.prototype
; 这是在Foo
执行之前完成的,以保证它不可能被搞乱。 之后,没有明确地通过Foo
就无法访问foo
的原型。
enter code here
链接地址: http://www.djcxy.com/p/30081.html