2011-12-19 39 views
4

如何在不调用构造函数的情况下复制对象及其原型链?如何在不调用构造函数的情况下复制对象及其原型链?

换句话说,函数dup在下面的例子中看起来像什么?

class Animal 
    @sleep: -> console.log('sleep') 
    wake: -> console.log('wake') 
end 
class Cat extends Animal 
    constructor: -> 
    super 
    console.log('create') 

    attack: -> 
    console.log('attack') 
end 

cat = new Cat()   #> create 
cat.constructor.sleep() #> sleep 
cat.wake()    #> wake 
cat.attack()   #> attack 

dup = (obj) -> 
    # what magic would give me an effective copy without 
    # calling the Cat constructor function again. 

cat2 = dup(cat)   #> nothing is printed! 
cat2.constructor.sleep() #> sleep 
cat2.wake()    #> wake 
cat2.attack()   #> attack 

,因为它的痛苦,我看为多,这里的例子的jsfiddle

尽管在我的例子中只使用函数,我还需要属性。

+1

您知道jsFiddle现在支持CoffeeScript了吗?使用左侧的**面板**菜单。 – 2011-12-19 20:26:19

+0

我没有,太棒了! – 2011-12-19 20:32:26

回答

5
function dup(o) { 
    return Object.create(
     Object.getPrototypeOf(o), 
     Object.getOwnPropertyDescriptors(o) 
    ); 
} 

其中依靠ES6 Object.getOwnPropertyDescriptors。你可以效仿它。 Taken from pd

function getOwnPropertyDescriptors(object) { 
    var keys = Object.getOwnPropertyNames(object), 
     returnObj = {}; 

    keys.forEach(getPropertyDescriptor); 

    return returnObj; 

    function getPropertyDescriptor(key) { 
     var pd = Object.getOwnPropertyDescriptor(object, key); 
     returnObj[key] = pd; 
    } 
} 
Object.getOwnPropertyDescriptors = getOwnPropertyDescriptors; 

Live Example

转换到这个CoffeeScript的留作练习用户。另请注意,dup浅拷贝自己的属性。

+0

这看起来不错!我相信这会起作用,只是一个呃逆。我似乎得到了一个继承自我传入的对象的对象。这与复制确切的原型链略有不同。在我被欺骗之后,有没有正确的方式来引用超级对象? – 2011-12-20 02:55:21

+0

明白了。 ''Object.getPrototypeOf(CAT)''。 – 2011-12-20 05:59:36

+0

大概重复将共享在原始对象的方法范围内词汇绑定的任何“本地”变量? – Alnitak 2013-07-04 15:23:24

0

您应该使用特殊的__proto__成员,该成员在每个对象中都可用,并且是指向对象类的原型的指针。以下代码为纯javascript:

function dup(o) 
{ 
    var c = {}; 

    for (var p in o) 
    { 
     c[p] = o[p]; 
    } 
    c.__proto__ = o.__proto__; 

    return c; 
} 
+2

''__proto__''已弃用,将被删除。 – 2011-12-20 06:00:25

相关问题