2013-05-16 43 views
0
var base = function() { }; 
base.prototype.doStuff = function() { 
    console.log(1); 
}; 

var foo = Object.create(new base()); 
console.log(typeof foo); //object 
foo.doStuff(); //1 

http://jsfiddle.net/xmYQn/修改创建的对象使用的Object.create()原型

我知道有一些类似的问题在那里,但我无法找到一个答案之一。

这是可行的,但是如果我想foo的类型为function,那么我可以添加属性到它的原型呢?换句话说,让它继承base原型的方法并将它们与它自己的原型合并?

回答

2
Object.create(new base()); 

,创建一个新对象平原其中来自base实例(从base.prototype等继承)继承。你几乎不需要这样的事情。

我想富的类型为功能

然后将它定义为一个函数:

function foo() {} 

......这样我就可以将属性添加到它的原型?

现在你可以做到这一点。

让它继承基础原型中的方法并将它们与自己的原型合并?

没有太多的“合并”。但是你可以创建一个新的对象,从base.prototype继承,设置为Foo的原型,然后添加你的属性有:

foo.prototype = Object.create(base.prototype); // of course, anything that was 
               // previously set on foo.prototype 
               // is now lost 
foo.prototype.constructor = foo; 
foo.prototype.doOtherStuff = function(){…}; 
… 

然后做

var fooInstance = new foo; 
fooInstance.doStuff(); // 1 
fooInstance.doOtherStuff(); 
+0

谢谢。你能解释为什么这个'foo.prototype.constructor = foo;'是必要的吗? – Johan

+0

@Johan:这不是必须的,[因为你几乎不需要使用'.constructor'属性](http://stackoverflow.com/q/12622137/1048572)。如果你没有这样做,'fooInstance.constructor'就是'base'(因为它从'base.prototype'继承它)。这可能会让人感到困惑,因此经常将其“纠正”为好习惯。在这个答案中,更多的是展示任意属性的设置:-) – Bergi

+0

@Bergi如果我们添加'base.prototype.anotherFuncInBase = function(){console.log('in base'); };'在基地。我们使用fooInstance'fooInstance .anotherFuncInBase()'调用它。这是怎么发生的? Object.create指向'base.prototype'的引用吗? – rab

1

自从我读这很不错的系列文章的(http://davidwalsh.name/javascript-objects-deconstruction),我会去这样的:

var Base = { 
    doStuff : function() { 
     console.log(1); 
    } 
}; 

var foo = Object.create(Base); 
foo.doStuff = function() { 
     console.log(2); 
    }; 

var foo2 = Object.create(foo); 

console.log(typeof foo); //object 
foo.doStuff(); //2 
foo2.doStuff(); //2 
+0

由于您使用的是对象,所以您可能需要做一些类似'$ .extend(foo,Base);'? – Johan

+0

但'extend'确实在一个时间点克隆它,而'Object.create'则构建对另一个对象的查找引用。您可以修改'Base',并且从它继承的所有对象(*包括已经实例化的*)都可以访问新的/已更改的属性。 – Bergi

+0

@Johan这里是两个方法的区别http://jsfiddle.net/xmYQn/1/(就像Bergi所解释的那样) – jbl