函数对象原型

时间:2015-11-29 13:21:41

标签: javascript 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 - > undefined,但obj.greet - >喂?

3 个答案:

答案 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.prototypefoo本身的 no 属性是其原型。 foo的原型由构造函数 Foo决定;这种方式更有意义,因为你可以在构造之后将任何旧值赋给foo.prototype,这会使foo通过将其转换为未初始化它的类的实例而中断。{/ p >

构造函数Foo同样没有任何意义,如果它将作为它定义的类的实例;它本身并没有被初始化,因此不能安全地假设它将满足其实例的行为。 FooFunction的一个实例,这是有道理的,因为它可以被调用。因此, Foo的原型Function.prototype不是 Foo.prototype

当您致电foo时,会设置foo = new Foo与其原型之间的关系。由于构造函数Foo的主体应该初始化实例,因此时间给它foo它的原型是有意义的。原型为对象提供了常见的行为,构造函数初始化对象,以便这些行为按预期工作。通过foo构建new Foo时分配给Foo.prototype的原型正是Foo;这是在 foo执行之前为了方便而完成的,并保证它不会被搞砸。在此之后,如果没有明确地通过Foo,就无法访​​问enter code here 的原型。

getIdentifier