2015-04-04 68 views
0

的所有实例和问题对象的原型,我在围绕原型继承在网络上搜索来显示原型分配到构造函数之前它的名字,就像下面的代码:分配后创建

Object.beget = function (o) { 
    var F = function() {}; 
    F.prototype = o; 
    return new F(); 
}; 

我的问题是,有没有办法来改变对象不是构造函数)的原型已经在这样我可以访问新的原型方法,而直接调用它的方式被instatiated后,或在换句话说,在这种方式下,物体继承其新原型方法

编辑:

我想这个问题的重点可能不是很清楚,我没有兴趣在提高对象的原型,我真正想要的是分配一个新的原型的方式,在不改变其他具有与第一个相同的原型的物体。

+0

而不是试图劫持单个实例的原型,只是创建一个新的对象实例。 – zzzzBov 2015-04-04 18:51:16

+0

@zzzzBov这将工作,但我不想传递前一个对象所有的值到新的。 – Roger 2015-04-04 18:58:05

+0

这就是为什么看到“扩展”方法的常见原因。 [jQuery有一个](http://api.jquery.com/jQuery.extend/),[下划线也是这样](http://underscorejs.org/#extend)。 – zzzzBov 2015-04-04 19:44:02

回答

1

有没有办法改变对象的原型后,它已经instatiated?

是的,有:Object.setPrototypeOf(仅ES6)的Object.getPrototypeOf对方 - 这访问对象真实的原型,而不仅仅是.prototype财产。还有.__proto__ getter/setter property(不赞成使用)也会这样做(请参阅Quick Javascript inheritance: Understanding __proto__)。

但是,请注意,这通常是一个可怕的想法。不仅因为可能有engines that don't support these,而且它还击败了引擎使用实例的所有优化优化:Why is mutating the [[prototype]] of an object bad for performance?

+0

这正是我需要的,非常感谢你的回答和参考文献@Bergi – Roger 2015-04-04 19:51:01

0

您可以指定新的属性到原来的对象,O,以及新的对象实例会自动访问这些属性:

Object.beget = function (o) { 
    var F = function() {}; 
    F.prototype = o; 
    return new F(); 
}; 

var o = { 
    a: 1 
}; 

var instance = Object.beget(o); 

instance.a === o.a; // true 

o.b = function() {}; 

instance.b === o.b; // true 
+0

可能的重复其实,我的怀疑是另一种方式,我不想要为了增强以前的原型,我想完全改变一个**对象**原型而不改变具有相同原型的其他对象的原型。 – Roger 2015-04-04 18:43:07

0

如果与创建对象后,该对象的变化相关联的原型(其中意味着所有来自前一个原型链的属性应该被删除并添加新的属性),是不是等同于用这个新原型创建一个新对象的实例?在这种情况下,为什么不创建一个新对象并使用它呢?

如果我缺少任何用例,请让我知道。

+0

正如我在另一篇评论中提到的那样,创建一个新对象的解决方案是可行的,但它与'劫持'对象的原型不同,因为以前的对象属性的所有值都必须转移到新的对象,除此之外创建新实例的开销。 – Roger 2015-04-04 19:12:12