JS使用new操作符创建对象的方法分析
1》new会在内存中创建一个新的空对象
2》new 会让this指向这个新的对象
3》执行构造函数 目的:给这个新对象加属性和方法
4》new会返回这个新对象
以上过程的伪代码:
1 let obj = new funA(); 2 3 1let temp = {}; 4 5 2temp._proto_ = funA.prototype; 6 7 3funA.bind(temp); 8 9 4obj = return funA() || temp;
注: 创建一个空对象将空对象的__proto__指向构造函数prototype使用空对象作为上下文调用构造函数
注释:会在内存中新创建一个对象/实例化一个对象JavaScript是一门基于原型的语言,但它却拥有一个 new 操作符使得其看起来象一门经典的面对对象语言。那样也迷惑了程序员们,导致一些有问题的编程模式其实你永远不需要在JavaScript使用 new Object()。用字面量的形式{}去取代吧。
同理,不要使用 new Array() ,而代之以字面量[]。JavaScript中的数组并不象Java中的数组那样工作的,使用类似Java的语法只会让你糊涂。
同理不用使用 new Number, new String, 或者 new Boolean。这些的用法只会产生无用的类型封装对象。就直接使用简单的字面量吧。
不要使用 new Function 去创建函数对象。用函数表达式更好。比如:
frames[0].onfocus = new Function(”document.bgColor='antiquewhite'”)
更好的写法是:
frames[0].onfocus = function () {document.bgColor = ‘antiquewhite';};
第二种形式让脚本编译器更快的看到函数主体,于是其中的语法错误也会更快被检测出来。有时候程序员使用 new Function 是因为他们没有理解内部函数是如何工作的。
selObj.onchange = new Function(”dynamicOptionListObjects[”+
dol.index+”].change(this)”);
如果我们让用字符串做函数体,编译器不能看到它们。如果我们用字符串表达式做函数体,我们同样也看不到它们。更好的方式就是不要盲目编程。通过制造一个返回值为函数的函数调用,我们可以明确的按值传递我们想要绑定的值。这允许我们在循环中初始化一系列 selObj 对象。
1 selObj.onchange = function (i) { 2 return function () { 3 dynamicOptionListObjects[i].change(this); 4 5 }; 6 }(dol.index);
myObj = new function () {
this.type = ‘core';
};
更好的方式是使用对象字面量,它更轻巧,更快捷。
myObj = {
type: ‘core'
};
假如我们需要创建的对象包含的方法需要访问私有变量或者函数,更好的方式仍然是避免使用new.
1 var foo = new function() { 2 function processMessages(message) { 3 alert(”Message: ” + message.content); 4 } 5 this.init = function() { 6 subscribe(”/mytopic”, this, processMessages); 7 } 8 }
1 var foo = new function() { 2 function processMessages(message) { 3 alert(”Message: ” + message.content); 4 } 5 this.init = function() { 6 subscribe(”/mytopic”, this, processMessages); 7 } 8 }
本文来自学习小花,作者:aixuexi666888,转载请注明原文链接:https://www.cnblogs.com/aixuexi666888/p/15516858.html