javascript是对象原型化语言,没有类的概念 ,他以对象为模板创建对象。为了让编程的风格尽量的靠近强大的java,作者煞费苦心的加入了new ,this这类关键字,在扭曲了原型化编程风格的同时,把原名livescript也改成了javascript。
一、如果抛弃new ,this这些字眼,回到原型化风格,看看javascript的对象编程如何爽快
1.1、定义函数对象
function test(_a,_b){
a = _a;
b= _b
} //也可以想下面这样
var test = function(_a,_b) {a = _a, b= _b}
函数对象将存在于内存,test指向首地址
1.2、调用函数,函数名是构造子,函数的调用产生新的对象
var testobj = test("arr1",function(){}) //参数当然可以是函数是吧
上语句执行过程: 分配内存区域,testobj指向起始地址,内存区分为数据区和堆栈,数据区存放a,b的数据,堆栈递归整个函数,函数执行完毕释放堆栈内存,数据a,b得到新的值。我只是言其大概,不要追究实际执行过程。
以上调用的结果,就是产生了一个新的对象 “testobj”,他是一个普通的对象{} 。 (函数对象是 function(){})
alert(testobj.a); //alert("arr1");
1.3、我们再调用函数
var testobj2 = test("arr2","arrx"); //此时testobj2被创建,
testobj,testobj2是不同的对象,指向不同的内存地址,是一般的对象,他们在含义上和java的对象没有区别
new不应该用 ;
this,更让人头疼,如在函数对象中用this,居然不让他指向函数内存的首地址,反而让他们都指向window,这是非常费解的,当然原因就出于new的出现。如下:
function test(_a){
this.a //this应该指向test ,不是window,因为test本身就是存在于内存中的函数对象
}
而对于 test("xx");
testobj = test("xx");这个对象为:
{
a:"xx"; //如果我们写 this.a = "xx",this指向的就是testobj;
}
this和new就不应该出现。他本身就应该有比java更简洁的语法。
1.4、定义一般对象:不需要this
var obj = {
a:"xx",
b:function(){
return a;
},
c:10000000
};
obj.b(); obj.a; ...
任何时候,我们都用 obj.a 这种方式
二、使用new也可以,不过我们要规范一下
1、函数充当类,里面的变量一定要加上this.前缀
function Class_test(_a, _b) {
this.a = _a; //this指向window,或者是包含Class_test这种“类”的对象,结合new ,this故作姿态的给新对象配置数据空间。
this.b = _b;
if(this == window){ true
alert("window");
}
}
加入了new 和 this后,变化的就是function这种对象,他们附加了this的特性,让程序复杂了很多,特别是使用起来。
2、对象或直接定义或根据new生成
var obj = {a:"",b:""};
var obj = new Class_test("",""); //this发挥作用,故作姿态的给新对象配置数据空间。
3、让函数function(){}充当类、当类来用,我们给它装上不恰当的构造子,如:
function classx( arg){
this.a;
this.structrue= function(_arg){
this.a = _arg;
}
this.structrue(arg); //用structrue真的构造子充当classx的伪构造子,这样才比较符合new的使用
}
var obj = new classx("你好!");// this.structrue(arg); 将会初始化类
alert(obj.a) ;//输出 alert("你好!")..
从这里可以看出本质来: 如果不加入new ,函数本身就是很爽快的构造子,是不是,你觉得呢!! 不加入new 函数能够很好的用作类对象,加入了new什么都不是了,只是多了个this来纠正它产生的错误。
另外:还有就是protocol这个属性,在原生的空间里没有必要多余的去强调原生的概念的,所以这个属性没有必要。