dzm*_*dzm 2 javascript prototype
我看到JavaScript中的对象最常用于以下两种方式.有人可以解释两者之间的区别和好处吗?是否存在一个更适合另一个的情况?
真的很感激任何澄清.非常感谢!
第一:
var SomeObject;
SomeObject = (function() {
function SomeObject() {}
SomeObject.prototype.doSomething: function() {
},
SomeObject.prototype.doSomethingElse: function() {
}
})();
Run Code Online (Sandbox Code Playgroud)
第二:
SomeObject = function() {
SomeObject.prototype.doSomething: function() {
},
SomeObject.prototype.doSomethingElse: function() {
}
}
Run Code Online (Sandbox Code Playgroud)
这两个例子都不正确.我想你的意思是:
第一:
var SomeObject;
SomeObject = (function() {
function SomeObject() {
}
SomeObject.prototype.doSomething = function() {
};
SomeObject.prototype.doSomethingElse = function() {
};
return SomeObject;
})();
Run Code Online (Sandbox Code Playgroud)
(注意匿名函数末尾的返回,使用=而不是:和分号来完成函数赋值.)
或者你的意思是:
function SomeObject() {
}
SomeObject.prototype.doSomething = function() {
};
SomeObject.prototype.doSomethingElse = function() {
};
Run Code Online (Sandbox Code Playgroud)
(没有匿名封闭功能.)
第二:
function SomeObject() {
}
SomeObject.prototype = {
doSomething: function() {
},
doSomethingElse: function() {
}
};
Run Code Online (Sandbox Code Playgroud)
(注意,对原型的赋值在函数之外SomeObject ;这里,我们使用:因为我们在一个对象初始化器中.并且我们;最后还有完成赋值语句.)
如果我是对的,那么它们之间几乎没有什么区别.它们都创建了一个SomeObject构造函数,并为其原型添加了匿名函数.第二个版本替换的SomeObject构造函数的原型有一个完全新的对象(我不推荐),其中第一个只是增强了原型SomeObject构造函数已经有了.
一个更有用的形式是:
var SomeObject;
SomeObject = (function() {
function SomeObject() {
}
SomeObject.prototype.doSomething = doSomething;
function doSomething() {
}
SomeObject.prototype.doSomethingElse = doSomethingElse;
function doSomethingElse()
}
return SomeObject;
})();
Run Code Online (Sandbox Code Playgroud)
在那里,我们分配的职能doSomething,并doSomethingElse有名称(他们显示在调用栈,断点列表等),当你通过调试代码走这是有用的.包含所有内容的匿名函数是存在的,因此doSomething和doSomethingElse名称不会污染封闭的名称空间.更多:Anonymousouses匿名
我们中的一些人更进一步:
var SomeObject;
SomeObject = (function() {
var p = SomeObject.prototype;
function SomeObject() {
}
p.doSomething = SomeObject$doSomething;
function SomeObject$doSomething() {
}
p.doSomethingElse = SomeObject$doSomethingElse;
function SomeObject$doSomethingElse()
}
return SomeObject;
})();
Run Code Online (Sandbox Code Playgroud)
......这样我们不仅可以看到doSomething,而且可以列SomeObject$doSomething在清单中.但有时可能会妨碍它,这是一种风格选择.(另请注意,我使用匿名函数来包含别名SomeObject.prototype,以减少输入.)