【问题标题】:Function object prototype [duplicate]函数对象原型 [重复]
【发布时间】:2016-03-03 04:24:14
【问题描述】:
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 -> 你好?

【问题讨论】:

  • 只有构造函数具有.prototype 属性,当您使用new 调用它们时会使用该属性。所有对象都有一个原型,但这不是一个属性。

标签: javascript prototype


【解决方案1】:

因为函数是与实例不同的对象

将属性放在一个对象上不会影响任何其他对象;甚至不是该对象或原型是其实例的函数。

【讨论】:

    【解决方案2】:

    原型只不过是实例从中继承属性的对象。

    所以,funcObj 是另一个原型(Function 的那个)的一个实例,它继承了它的所有属性。此外,它本身有一个prototype,您可以在其上绑定任何您想要的东西,并且一旦您调用它来构造funcObj 的新实例(即,当您与new 一起调用它时),该原型将被使用密钥,如new funcObj())。

    因此,funcObj 没有名为 greet 的成员是完全正常的,而它的实例有它。

    【讨论】:

    • 因此每个函数对象本身都是 Function 构造函数的一个实例。所以如果我将我的属性添加到 Function.prototype 它将由所有函数实例共享,对吗?
    • 或多或少。其实函数绑定的范围不同,都是当前的this引用。
    【解决方案3】:

    就像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 转换为未初始化的类的实例来破坏它。

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

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

    enter code here
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-07
      • 1970-01-01
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多