《8用json做原型》由会员分享,可在线阅读,更多相关《8用json做原型(6页珍藏版)》请在金锄头文库上搜索。
1、在 Javascript 学习笔记 5类和对象中,我简单地提到了利用 JSON 去构造一个对象。代码如下:var People = name: kym,age: 21,SayHello: function () alert(Hello,My name is + this.name + .I am + this.age);alert(People.name);People.SayHello();script但是我们是不能重用这个对象的,我们如何把这个对象作为原型的呢?首先,在一个 JSON 对象有一个构造方法是不可能的了,那么我们就做一个简单的“工厂”吧,写一个方法来专门负责创建。var Peo
2、ple = Create: function (name, age) this.name = name; this.age = age;,SayHello: function () alert(Hello,My name is + this.name + .I am + this.age);People.Create(kym, 21);People.SayHello();script但是通过这个方法我们却发现,我们没有办法用 People 作为原型,让我们回顾一下:Javascript 学习笔记 7原型链的原理 这篇文章,我们想一下这个过程:var p=new People();=p._pro
3、to_=People.prototype。于是当我们p.SayHello()的时候就会去 People.prototype 中去找,结果什么都找不到。如果可以 People.prototype.SayHello=function()就可以解决这个问题。但是我们知道,只有 function 才可以有 prototype。那么我们想想之前的推导公式,怎么样能让 p.SayHello()呢?如果可以p._proto_=People 就好了。那么我们想个办法:既然在 new 的时候,某个对象的_proto_只能等于某个函数的 prototype,我们设置一个函数 X,令 p._proto_=X.pro
4、totype,我们再令 X.prototype=People。这样的关系是这样: var People = Create: function (name, age) this.name = name;this.age = age;,SayHello: function () alert(Hello,My name is + this.name + .I am + this.age);var X = function () ;X.prototype = People;var p = new X();p.Create(kym, 21);p.SayHello();script这样就相当于用 X 做了
5、一个中间变量,使得我们可以访问 JSON 对象的内部属性。但是这样是不是不太优雅呢?我们每次创建一个对象时,都需要来写这样一个辅助的函数。那好,我们就把这个过程封装起来:var Factory = CreatePeople : function (className,name,age) var temp = function () className.Create(name, age);temp.prototype = className;var result = new temp();return result;var people = Factory.CreatePeople(People
6、,kym,21);people.SayHello();但是这样也有一个缺点,就是每次我增加一个类,就需要向 Factory 里注册一个新方法,这样是很麻烦的,我在很久以前的 玩转方法:call 和 apply 中说过关于 call 和 apply 的区别,因为这里的参数不固定,我们不可能一一列举,因此我们在这里可以用 apply 来改善这个方法:var People = Create: function (name, age) this.name = name; this.age = age;,SayHello: function () alert(Hello,My name is + thi
7、s.name + .I am + this.age);var Factory = Create: function (className, params) var temp = function () className.Create.apply(this, params);temp.prototype = className;var result = new temp();return result;var people = Factory.Create(People,kym,21);people.SayHello();script这样,一个完整的创建类就诞生了!那么我们每次创建“类”时就都可以用 JSON 来做了,然后用户每次都统一来调用 Factory.Create()就可以了!