化作原型看起来像:
var someObject = function() {
this.a = "somevalue";
};
someObject.prototype.func1 = function() { // work };
someObject.prototype.func2 = function() { // work };
var myObject = new someObject();
有哪些优势?好吧,有一堆,但有 是少数真正的实际原因,当原型使 比对象文字更有意义。
首先是减少重复代码;所以,可以说你想 另一个对象很熟悉objectName
,但你想要a
到 是一个不同的值。你可能最终会是这样的:
var objectName = {
a : 'somevalue',
func1: function(){ },
func2: function(){ }
}
var otherObjectName = {
a : 'otherValue',
func1: function(){ },
func2: function(){ }
}
而且你可以说
var objectName = {
a : 'somevalue',
func1: function(){ },
func2: function(){ }
}
var otherObjectName = {
a : 'otherValue',
func1: objectName.func1,
func2: objectName.func2
}
或者,使用原型减少重复的功能,我可以让这样我就可以在价值传递在建造物体期间我想要a
。重构代码看起来像这样:
var someObject = function(a) {
this.a = a;
};
someObject.prototype.func1 = function() { /* work */ };
someObject.prototype.func2 = function() { /* work */ };
var myObject = new someObject("somevalue");
var myOtherObject = new someObject("otherValue");
现在,如果我想添加一个新的功能,他们两个。使用对象字面apporach,那么你将不得不记得也将其添加到otherObjectName。随着文字数量的增加,管理它们需要花费更长时间和更多的难度。
使用原型方法,所有我们不得不说的是:
someObject.prototype.func3 = function() { // do even more work }
或更有趣,我可以动态地仅 说有一个参考延长两个对象。
// find what function made me, get its prototype, and add a new function to it
myObject.constructor.prototype.func3 = function() { /* work */ }
myOtherObject.func3() // tada magic!
或我可以做一个新的对象,只知道一个参考。像:
var newObject = myObject.constructor(myObject.a + " new");
因为无论myObject
和myOtherObject
共享相同constructor
和prototype
,也有很多有趣的事情 你可以用这种关系,你不能使用对象文本做做。
您可以将原型想象成小工厂来创建对象 ,而不必将每个对象都创建为字面值。
现在,如果你在想,“呃,我只会有一个 这些,我不会去做你的任何疯狂的方法 扩展魔术。“然后定义一个对象文字是一个完全有效的应用程序 对于一些问题。有时使用原型更好。使用 模式是有意义的,您正试图解决的问题, ,而不是试图将您的问题,以适应
非常好的解释...谢谢 – Anshul
我没有得到它:( –
那么定义函数在构造函数中和定义它在原型之间有什么区别或优点:constructor.prototype.func = function( ){}; –