在对象上找不到JavaScript Prototype方法

时间:2016-02-11 06:29:25

标签: javascript

根据我的阅读,如果在对象上找不到属性或方法,则在对象的原型上搜索。在下面的例子中,我创建了一个对象。然后将该对象的原型分配给对象文字。我现在能够访问对象原型的方法。但是无法访问对象上的相同内容。为什么这样?



var functionMaster = Object.create(null); 

//assign proto to below object literal
functionMaster.prototype = {

  printVal: function() {
    console.log('Hello test');
  },
  printNo: function(num) {
    console.log(num);
  }
}


//Works as expected
functionMaster.prototype.printVal();
//Doesnt find PrintVal() method
functionMaster.printVal();




1 个答案:

答案 0 :(得分:4)

  

然后将该对象的原型分配给对象文字。

不,你没有。 prototype属性在(构造函数)函数对象上只有特殊含义:

function Constr() {}
Constr.prototype.foo = 42;

var instance = new Constr();
console.log(instance.foo); // 42
console.log(Object.getPrototypeOf(instance) === Constr.prototype); // true

在您的情况下,将prototype属性分配给对象,它只是一个没有特殊含义的普通属性。您可以通过运行Object.getPrototypeOf(functionMaster)来验证这一点。它将返回null

  

但无法在对象上访问相同内容。为什么这样?

由于您明确将对象设置为null,因此该对象根本没有原型。你要么

var functionMaster = Object.create({
  printVal: function() {
    console.log('Hello test');
  },
  printNo: function(num) {
    console.log(num);
  }
}); 

Object.setPrototypeOf(functionMaster, {
  printVal: function() {
    console.log('Hello test');
  },
  printNo: function(num) {
    console.log(num);
  }
});