您的位置:首页 > Web前端 > JavaScript

谈谈对JS中Propotype原型的理解

2013-11-07 21:39 162 查看
一直对第一篇博客中的下面propotype 式创建对象的方式不理解

var Class = {
create : function () {
return function () {
this.initialize.apply(this, arguments);
}
}
};


var Calendar = Class.create();

Calendar.prototype = {
initialize : function (container, options) {
this.Container = $(container);
this.Days = [];
this.SetOptions(options);
XXX....
},
SetOptions : function (options) {
},
PreMonth : function () {
},
NextMonth : function () {
},
Draw : function () {
},
IsSame : function (d1, d2) {
}

var c = new Calendar("idCalendar", {XXX...};

后来看书知道,每个function都有个属性propotype 表示"原型对象",所有由这个方法产生的对象都共享这个原型对象的方法和属性。

var Calendar = Class.create();//这句 返还一个函数给 Calendar 相当于 :var Calendar =function(){
this.initialize.apply(this, arguments);
}

而这句 this.initialize.apply(this,arguments); 怎么看都看不懂,多方百度,大致就是这个意思,两个this指向肯定是一个对象,apply 的意思是指定某个对象调用 此方法并传递参数,那么这句话的意思是这个构造函数要创建的对象调用自己的initialize();看起来很拗口,为什么要这么繁琐呢,一直想不明白。

直到刚刚看了《悟透JavaScript》一文,加上这些天对原型的理解,终于恍然大悟。

引用其中的话 我们已经知道,用 var anObject = new aFunction() 形式创建对象的过程实际上可以分为三步:

第一步是建立一个新对象;第二步将该对象内置的原型对象设置为构造函数prototype 引用的那个原型对

象;第三步就是将该对象作为this 参数调用构造函数,完成成员设置等初始化工作。对象建立之后,对象

上的任何访问和操作都只与对象自身及其原型链上的那串对象有关,与构造函数再扯不上关系了。换句话

说,构造函数只是在创建对象时起到介绍原型对象和初始化对象两个作用。

那么,我们能否自己定义一个对象来当作原型,并在这个原型上描述类,然后将这个原型设置给新创建

的对象,将其当作对象的类呢?我们又能否将这个原型中的一个方法当作构造函数,去初始化新建的对象

呢?

本例中我们就为构造函数定义了一个原型对象Calendar

Calendar.prototype={XXX...};

这个就相当于我们“类”的概念

然后我们的构造函数也包含在这个原型中,正常我们 创建对象的步骤是定义构造函数,为构造函数指定原型。

然后是

var Class = {
create : function () {
return function () {
this.initialize.apply(this, arguments);
}
}
};//这里是返回一个构造函数

这里巧妙的将构造函数放在一个通用的创建构造函数的方法内作为匿名函数返回,而不是硬编码在代码中,这样同样用这个方法创建的对象拥有不同的构造函数,也就是不同的原型,数据不共享,模拟了类创建对象的过程。

而这里的

this.initialize.apply(this, arguments);可改为

this.initialize(arguments[0],arguements[1]);因为本例中构造函数参数是两个,可是我怎么知道参数个数,所以在这个用于创建构造函数的通用方法里
采用这种方法,意思为通知这个对象,调用原型中的initialize方法,并传递参数,怎么样,是不是感慨前辈的博大精深!!

[/code]
其实最主要是要理解JS中的function 就是一个对象,储存的不是数据而是一定的代码逻辑,new 的时候其实就是 new 的 Class.create()的内容 ,是什么呢,就是要你调用自己的initialize,这个方法去哪里找呢,就是去方法的原型对象(propotype)里找,然后传参赋值初始化,然后 也自然获得了原型里的定义的各种方法。

强烈推荐《悟透JavaScript》 书里用禅与哲学的方式讲的很生动透彻。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: