New*_*oJS 2 javascript constructor prototype
有一点我不明白原型和构造函数..
假设我有这个构造函数,它将创建一个带有'name'属性和'logName'方法的对象
function MyExample(param1){
this.name = param1;
};
MyExample.prototype.logName = function(){
console.log(this.name);
}
Run Code Online (Sandbox Code Playgroud)
我理解我刚刚在构造函数的(myExample)原型中添加了一个方法(logName).当我使用这个构造函数创建一个新对象(我)时,该对象将继承'name'属性和'logName'方法.logName方法将成为新对象(me)proto属性的一部分
var me = new MyExample('bob');
me.logName(); //bob
Run Code Online (Sandbox Code Playgroud)
..但为什么不直接将logName方法添加到构造函数创建的对象中?(不是构造函数的原型)不会提供相同的结果吗?即使'logName'不是新对象的proto属性的一部分.
function MyExample(param1){
this.name = param1;
this.logName = function(){
console.log(this.name)
};
};
var me = new MyExample('bob');
me.logName(); //bob
Run Code Online (Sandbox Code Playgroud)
在第二个示例中,logName每次创建新实例时都会重新创建该实例MyExample.如果使用MyExample原型,则logName在MyExample对象的所有实例之间共享一个方法,并自动传递上下文.
原型还允许您在以后添加新方法,该方法可以由该类型的现有对象访问,或者全局修改类型的所有对象的方法.
如果您想了解更多信息,使用原型的优点,直接在构造函数中定义方法,这个问题涉及同一主题?
在构造函数中创建该方法的问题是它没有在MyExample.
相反,每个MyExample函数都有自己的函数副本。随着实例数量的增加,它最终会占用更多的内存,如果由于某种原因您想在运行时修改所有 MyExamples,则必须更改每个实例函数而不是修改原型。
这是每个人查看维基百科的同一个“副本”与每个人将所有维基百科保存到硬盘上并阅读它之间的区别。它毫无意义地占用了额外的硬盘空间,如果维基百科被更新,每个人都错了,直到他们下载新版本。
如果由于某种原因您需要一个在实例之间非常相似但每个实例略有不同的函数(例如,使用闭包变量),那么在构造函数中创建方法可能是正确的方法。
| 归档时间: |
|
| 查看次数: |
78 次 |
| 最近记录: |