函数对象原型

Function object prototype

本文关键字:原型 对象 函数      更新时间:2023-09-26
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.prototypefoo本身没有任何属性是它的原型。 foo的原型由其构造函数Foo决定;这种方式更有意义,因为您可以在构造foo.prototype后将任何旧值分配给它,这会通过将它转换为未初始化的类的实例来破坏foo

如果构造函数Foo充当它定义的类的实例,则同样没有任何意义;它尚未由自身启动,因此不能安全地假设它将实现为其实例预期的行为。 FooFunction的一个实例,这是有意义的,因为它可以被调用。 因此Foo原型是Function.prototype而不是Foo.prototype

foo与其原型之间的关系是在调用foo = new Foo时设置的。 由于构造函数Foo的主体需要初始化实例,因此这是foo提供有意义的原型的唯一时间。 原型为对象提供了其常见行为,构造函数初始化对象,以便这些行为按预期工作。 通过new Foo构造时分配给foo的原型就是Foo.prototype;这是执行之前完成的Foo以方便和保证它不可能被搞砸。 在此之后,如果不明确Foo,就无法访问foo的原型。

enter code here