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
- > undefined,但obj.greet
- >喂?
答案 0 :(得分:2)
原型只不过是实例继承属性的对象。
因此,funcObj
是另一个原型(Function
之一)的一个实例,它继承了所有属性。此外,它本身有一个prototype
,您可以在其上绑定任何您想要的内容,并且一旦您调用它以构建funcObj
的新实例(即,当您同时调用它时)将使用该原型new
关键字,new funcObj()
)。
正因为如此,funcObj
没有名为greet
的成员,而其实例拥有成员,这是完全正常的。
答案 1 :(得分:0)
因为该函数是与实例不同的对象。
将属性放在一个对象上不会影响任何其他对象;甚至该对象或原型都不是函数的函数。
答案 2 :(得分:0)
就像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
本身的 no 属性是其原型。 foo
的原型由构造函数 Foo
决定;这种方式更有意义,因为你可以在构造之后将任何旧值赋给foo.prototype
,这会使foo
通过将其转换为未初始化它的类的实例而中断。{/ p >
构造函数Foo
同样没有任何意义,如果它将作为它定义的类的实例;它本身并没有被初始化,因此不能安全地假设它将满足其实例的行为。 Foo
是Function
的一个实例,这是有道理的,因为它可以被调用。因此, Foo
的原型为Function.prototype
,不是 Foo.prototype
。
当您致电foo
时,会设置foo = new Foo
与其原型之间的关系。由于构造函数Foo
的主体应该初始化实例,因此仅时间给它foo
它的原型是有意义的。原型为对象提供了常见的行为,构造函数初始化对象,以便这些行为按预期工作。通过foo
构建new Foo
时分配给Foo.prototype
的原型正是Foo
;这是在 foo
执行之前为了方便而完成的,并保证它不会被搞砸。在此之后,如果没有明确地通过Foo
,就无法访问enter code here
的原型。
getIdentifier