Object.create(prototype)和Object(prototype)的区别

3
一个快速但难以在谷歌上搜索到答案的问题:
var child = Object.create(parent.prototype);

var child = Object(parent.prototype); 

他们是相同的吗?
编辑: 我的问题是由实现寄生组合继承模式的inheritPrototype函数的这两个示例引起的。
function inheritPrototype(childObject, parentObject) {
    var copyOfParent = Object.create(parentObject.prototype);
    copyOfParent.constructor = childObject;
    childObject.prototype = copyOfParent;
}

http://javascriptissexy.com/oop-in-javascript-what-you-need-to-know/

function inheritPrototype(subType, superType){
    var prototype = object(superType.prototype); 
    prototype.constructor = subType; 
    subType.prototype = prototype;
}

"Parasitic Combination Inheritance"在《JavaScript高级程序设计》一书中的应用


1
在Chromium中,object未定义。 - jcubic
https://dev59.com/r3E85IYBdhLWcg3wkkfK - Yellen
object 应该改为 Object - Manwal
已经回答了一个问题,谢谢!小的“object”是引用而不是打字错误 - 在那种情况下是引用的打字错误,我猜 ;) - hwechselberg
3个回答

3
不,它们并不相同,请看下面:
1. Object.create(prototype) 将创建一个新的原型,该原型继承自作为参数传递的prototype。 2. Object(obj)new Object(obj) 将创建一个新的obj实例,并调用构造函数。
由于原型也是 JavaScript 对象,因此差异可能很小。但是,Object.create 可以处理可能需要参数的构造函数,而new Object()则无法处理。
更多信息请参见此 SO 相关答案(例如差异继承、自定义属性等)。 参考资料
1. MDN 上的Object.create 2. MDN 上的new Object 更新:在 OP 编辑后
在我的 OOP JavaScript 框架Classy.js 中,有一个关于旧浏览器的Object.create 的 polyfill,这可能会阐明您在差异方面的更多问题。
   Create = Obj.create || function( proto, properties ) {
        var Type = function () {}, TypeObject;
        Type[PROTO] = proto;
        TypeObject = new Type( );
        TypeObject[__PROTO__] = proto;
        if ( 'object' === typeOf(properties) ) defineProperties(TypeObject, properties);
        return TypeObject;
    }

这个 polyfill 可以处理任意带有参数的构造函数,就像 Object.create 一样,并确保正确地分配 __proto__。使用 Object(prototype) 的模式是试图(弱引用)prototype


@hwechselberg,这与Object(obj)相同,因为任何原型也都是(javascript)对象。 Object将调用构造函数,这可能会对具有参数(或复杂构造函数)的构造函数产生问题,而Object.create则不会。还有其他差异(根据引用链接)。另请参见MDN上的Object.create - Nikos M.
@hwechselberg,我更新了答案,在面向对象库的Object.create周围添加了polyfill,以便更清楚地看到差异。 - Nikos M.

3
不,它们不同:

Object(X)new Object(X)Object.create(X.prototype) 相同

Object(X) 将创建对象并运行 Constructor(即新创建的对象继承自构造函数的原型)。Object.create(X.prototype) 创建对象时还会额外运行 Constructor

Object(X)new Object(X) 不同于 Object.create()

Object.create() 创建对象时不会运行 Constructor(即它将创建一个不继承任何内容的对象)。

1
新对象将子对象设置为父对象。
var parent = {name : 'proto'};
var child = new Object(parent);
console.log(child === parent);//=true
//if I set child.name it will change parent.name

Object.create返回一个对象实例,该实例使用第一个参数作为其proto(原型链中使用的第一个原型)。

child = Object.create(parent);
console.log(child === parent);//=false
//I can set child.name because it will be shadowed
//  and will not change parent.name
console.log(child.hasOwnProperty('name'));//=false

更多关于原型的信息可以在这里找到:https://dev59.com/J2Qo5IYBdhLWcg3wbe5K#16063711


谢谢。但在这些示例中,它是Object.create(parent.prototype)和new Object(parent.prototype),所以我仍然不完全明白。 - hwechselberg
@hwechselberg 抱歉,没有看到那个。但是当你执行child.prototype = new Object(parent.prototype)时,为什么要将child.prototype设置为parent.prototype呢?这样的话child.prototype === parent.prototype,而在继承中你不希望这样,因为你希望Child.prototype是一个(空)对象,并且它的原型设置为你想要继承的内容(在我的答案链接中有解释)。你希望延长原型链(Child.prototype => Parent.prototype => Object.prototype),而不是用Parent.prototype替换Child.prototype:(Child.prototype === Patent.prototype => Object.prototype) - HMR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接