Javascript 理解原型遗传

Javascript 理解原型遗传,javascript,object,inheritance,prototypal,Javascript,Object,Inheritance,Prototypal,当我检查prototype是否等于对象时。prototype: 前两个返回true,而第三个返回false 为什么会这样 var Object1 = {}; var Object2 = new Object(); var Object3 = Object.create({}); 方法创建具有指定原型对象和属性的新对象 它在幕后做了以下工作: Object.getPrototypeOf(Object1)===Object.prototype //true Object.getPrototypeO

当我检查prototype是否等于
对象时。prototype

前两个返回
true
,而第三个返回
false

为什么会这样

var Object1 = {};
var Object2 = new Object();
var Object3 = Object.create({});
方法创建具有指定原型对象和属性的新对象

它在幕后做了以下工作:

Object.getPrototypeOf(Object1)===Object.prototype //true
Object.getPrototypeOf(Object2)===Object.prototype //true
Object.getPrototypeOf(Object3)===Object.prototype //false
因此,正确的用途是:

Object.create = (function() {
  var Temp = function() {};
  return function (prototype) {
    if (arguments.length > 1) {
      throw Error('Second argument not supported');
    }
    if (typeof prototype != 'object') {
      throw TypeError('Argument must be an object');
    }
    Temp.prototype = prototype;
    var result = new Temp();
    Temp.prototype = null;
    return result;
  };
})();
或者,如果您想让您的示例发挥作用:

var Object3 = Object.create(Object.prototype);
在这里,原型链开始发挥作用:

Object.getPrototypeOf(Object.getPrototypeOf(Object3)) === Object.prototype // true 

原因很简单,如果您查看文档中的,您会发现此方法:

使用指定的原型对象和 财产

如果你把它叫做:

console.dir(Object3)
 -> __proto__: Object (=== Your Object Literal)
   -> __proto__: Object (=== Object.prototype)
您传递的不是原型,而是没有属性的空对象

因此,如评论中所述,您需要这样称呼它:

Object.create({})

尝试
Object.create(Object.prototype)
但为什么会发生这种情况?因为
{}!=Object.prototype
(其中
{}
是您用作
Object3
原型的对象)
Object.create(Object.prototype)