在匿名范围内使用Javascript原型对象
我有两种不同的方式在匿名范围内使用Javascript对象在匿名范围内使用Javascript原型对象,javascript,prototype,Javascript,Prototype,我有两种不同的方式在匿名范围内使用Javascript对象 (function(){ function MyObject() { this.MyMethod = function() { //code here } } first = new MyObject(); first.MyMethod(); })(); 及 我知道原型版本更好,但不确定使用匿名作用域是否会带来不同的优点/缺点。在这种情况下,我
(function(){
function MyObject() {
this.MyMethod = function() {
//code here
}
}
first = new MyObject();
first.MyMethod();
})();
及
我知道原型版本更好,但不确定使用匿名作用域是否会带来不同的优点/缺点。在这种情况下,我认为它们几乎是等效的。每次执行外部匿名函数时,都将对这两个函数进行解释
因此,只要您在内部只调用一个
newmyobject()
,这并不重要。如果您不止一次地调用它,那么最好使用原型版本 在这种情况下,我认为它们几乎是等价的。每次执行外部匿名函数时,都将对这两个函数进行解释
因此,只要您在内部只调用一个
newmyobject()
,这并不重要。如果您不止一次地调用它,那么最好使用原型版本 我不认为这有什么区别。IIFE(立即调用的函数表达式)是为了防止变量泄漏到全局范围
两个
MyObject
都是构造函数,但第一个构造函数具有作为该实例唯一属性的函数(将在调用new
时克隆)。在第二个示例中,您向该构造函数的原型添加了一个方法,使其对所有实例都可用,这就是为什么第二个示例更受欢迎。我认为这没有什么区别。IIFE(立即调用的函数表达式)是为了防止变量泄漏到全局范围
两个
MyObject
都是构造函数,但第一个构造函数具有作为该实例唯一属性的函数(将在调用new
时克隆)。在第二个示例中,您向该构造函数的原型添加了一个方法,使其可用于所有实例,这就是为什么第二个示例是首选的。在匿名范围中使用没有区别
其好处与在全局范围内使用相同
如果您正在实例化MyObject,那么“原型”版本将避免在每个实例中复制该方法,从而避免浪费资源(内存)
如果实例化MyObject一两次,则立即函数与全局作用域中的一样不会有任何区别。在匿名作用域中使用不会有任何区别 其好处与在全局范围内使用相同 如果您正在实例化MyObject,那么“原型”版本将避免在每个实例中复制该方法,从而避免浪费资源(内存)
如果要实例化MyObject一两次,则立即函数与全局作用域没有区别。没有区别。好处仍然是一样的。不过,如果这意味着只创建该构造函数的一个实例,那么只需使用对象文字,这并没有什么区别。好处仍然是一样的。如果这意味着只创建该构造函数的一个实例,那么只需使用对象文字即可。我明白了,因此第一个示例更类似于PHP(每次创建对象都会复制方法)。我猜如果原型有一个构造器,同样的事情也会发生。。。不,不是这样的。使用“prototype”意味着对象的每个实例将共享相同的方法,即通过引用访问。所以这更像PHP。如果没有“原型”,每个实例都将有自己的方法副本。-但是,比较JavaScript到PHP(或类似C语言的C++语言或java语言的高级语言)可能会导致错误的结论或糟糕的编程模式,因为JavaScript是一种无类和功能语言。我建议学习一点JS基础知识……我写这篇文章是因为我过去犯过同样的错误!我认为它看起来像C,让我们把它当作是C,有一些小的区别。不,坏主意。这完全是另一回事!我明白了,所以第一个例子更类似于PHP(每次创建对象都会复制方法)。我猜如果原型有一个构造器,同样的事情也会发生。。。不,不是这样的。使用“prototype”意味着对象的每个实例将共享相同的方法,即通过引用访问。所以这更像PHP。如果没有“原型”,每个实例都将有自己的方法副本。-但是,比较JavaScript到PHP(或类似C语言的C++语言或java语言的高级语言)可能会导致错误的结论或糟糕的编程模式,因为JavaScript是一种无类和功能语言。我建议学习一点JS基础知识……我写这篇文章是因为我过去犯过同样的错误!我认为它看起来像C,让我们把它当作是C,有一些小的区别。不,坏主意。这完全是另一回事!
(function(){
function MyObject(){};
MyObject.prototype.MyMethod = function() {
//code here
}
first = new MyObject();
first.MyMethod();
})();