国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JavaScript > 正文

用方法封裝javascript的new操作符(一)

2019-11-21 00:01:41
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
先看個(gè)例子:
復(fù)制代碼 代碼如下:

var Class = {
create : function () {
return function () {
this.initialize.apply(this, arguments);
}
}
}
var A = Class.create();
A.prototype = {
initialize:function(){
//todo
}
test:"abc"
}
var a = new A();

這是很多jser構(gòu)建類和實(shí)例化對(duì)象的過(guò)程, 細(xì)心的人會(huì)發(fā)現(xiàn): 實(shí)例化的a會(huì)多一個(gè)initialize方法。initialize在實(shí)例化時(shí)做為代理在實(shí)例化后就沒(méi)有存在的意義了,而且有時(shí)候會(huì)引起不必要的麻煩,比如 for…in 語(yǔ)句遍歷a時(shí),會(huì)把initialize這個(gè)方法遍歷出來(lái)。
我首先想到的是用前面博文中寫(xiě)的Class.js來(lái)做,這樣就非常干凈。但是在Class.js中的繼承機(jī)制有一些bug的,在不入侵(即:不修改原型、不生成額外屬性)的條件下,要實(shí)現(xiàn)接口更是難上加難了。于是我就想到封裝new操作符,這樣做的好處就是 可先修改原型,在封裝new的方法中,實(shí)現(xiàn)繼承、接口,并去除額外屬性。
我們首先給new操作符的簡(jiǎn)單的實(shí)現(xiàn)一下:
復(fù)制代碼 代碼如下:

function New(){//new是關(guān)鍵字,所以要區(qū)別一下
var as = [],args = arguments;
for(var i=1;i<args.length;i++){
as.push('args['+i+']');
}
nobj = eval("new args[0]("+as.join(",")+");");
return nobj;
}
接下來(lái)測(cè)試一下:
function A(n){ this.name = n;}
var a1 = new A('ts');
alert(a1.name);//ts
var a2 = New(A,'tangoboy');
alert(a2.name);//tangoboy
測(cè)試成功,現(xiàn)在New方法基本可以代替new操作符實(shí)例化對(duì)象了。
然后 解決文章開(kāi)始的initialize問(wèn)題就非常簡(jiǎn)單了:
function New(){
var as = [],args = arguments;
for(var i=1;i<args.length;i++){
as.push('args['+i+']');
}
nobj = eval("new args[0]("+as.join(",")+");");
delete nobj.initialize;//刪除實(shí)例化對(duì)象的方法
return nobj;
}

下一節(jié)開(kāi)始豐富New方法。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 信丰县| 瑞安市| 隆子县| 古田县| 图们市| 黄陵县| 休宁县| 来宾市| 奉贤区| 永城市| 遵义县| 乐平市| 平罗县| 玛多县| 中西区| 元氏县| 东港市| 临清市| 七台河市| 扶绥县| 新巴尔虎右旗| 文成县| 南涧| 营山县| 普兰店市| 大同县| 湘阴县| 南开区| 南京市| 阿拉善左旗| 金山区| 鄂尔多斯市| 博爱县| 黄平县| 上林县| 延津县| 房山区| 鹤壁市| 浏阳市| 自治县| 外汇|