函数对象原型
Function object prototype
function funcObj() { }
funcObj.prototype.greet = "hello";
console.log(funcObj.greet) // undefined ???
console.log(funcObj.prototype.greet) // hello
var obj = new funcObj();
console.log(obj.greet); // hello
根据我对原型的理解。如果您访问某个对象的成员,它将在该对象中不可用时从原型对象中获取它。
我的问题是:
既然 Javascript 中的函数是对象,为什么funcObj.greet
-> 未定义,但obj.greet
->你好?
不过是一个对象,实例从中继承属性。
因此,funcObj
是另一个原型(Function
的一个(的实例,它继承了所有属性。此外,它本身有一个prototype
,您可以在其上绑定任何您想要的内容,并且一旦您调用它来构建新的funcObj
实例(也就是说,当您将其与new
键一起调用时,将使用该原型,如new funcObj()
(。
正因为如此,funcObj
没有一个名为 greet
的成员是完全正常的,而它的实例有它。
因为函数是与实例不同的对象。
将属性放在一个对象上不会影响任何其他对象;甚至不会影响该对象或原型作为实例的函数。
就像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
。
如果构造函数Foo
充当它定义的类的实例,则同样没有任何意义;它尚未由自身启动,因此不能安全地假设它将实现为其实例预期的行为。 Foo
是Function
的一个实例,这是有意义的,因为它可以被调用。 因此Foo
的原型是Function.prototype
,而不是Foo.prototype
。
foo
与其原型之间的关系是在调用foo = new Foo
时设置的。 由于构造函数Foo
的主体需要初始化实例,因此这是foo
提供有意义的原型的唯一时间。 原型为对象提供了其常见行为,构造函数初始化对象,以便这些行为按预期工作。 通过new Foo
构造时分配给foo
的原型就是Foo.prototype
;这是在执行之前完成的Foo
以方便和保证它不可能被搞砸。 在此之后,如果不明确Foo
,就无法访问foo
的原型。
enter code here
- Node.js中的JavaScript原型对象效率
- 获取原型对象的名称
- 如何维护对原型对象的访问
- 文字与原型对象表示法的数据结构
- 使用原型对象向javascript对象添加自定义属性和方法的建议
- 正在重置原型对象的构造函数属性
- 编写JS原型时,所有函数都应该使用原型对象
- 什么's是原型对象的真实名称
- Javascript - 使用数组作为函数的参数,并在创建新的原型对象时更改值
- 在原型对象 jquery 上将一个按钮与另一个按钮不同
- 原型对象
- 循环遍历数组时的原型对象
- 为什么初始化的 JavaScript 对象不包含原型对象
- JavaScript 原型对象 - 如何访问继承
- Javascript:获取此原型对象名称
- 如何在数据绑定后在 KNOCKOUT js 中使用“with”访问另一个原型对象
- 这在 JavaScript 中的原型对象中的值
- 在主干中向原型对象添加值不起作用
- 删除函数原型对象
- 为什么当我在这个JavaScript对象上使用反射时,我可以'看不到在其原型对象中定义的属性