在对象上找不到 JavaScript 原型方法

cyn*_*ynx 2 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();
Run Code Online (Sandbox Code Playgroud)

Fel*_*ing 6

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

不,你没有。该prototype属性仅对(构造函数)函数对象具有特殊含义:

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

var instance = new Constr();
console.log(instance.foo); // 42
console.log(Object.getPrototypeOf(instance) === Constr.prototype); // true
Run Code Online (Sandbox Code Playgroud)

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

但无法访问相同的对象。为什么这样?

该对象根本没有原型,因为您将其显式设置为null. 你要么想要

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

或者

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