欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

OO JavaScript

系統 2079 0

如何創建JavaScript Object呢?有如下幾種方法:

一、Constructor Pattern

?

    function Person(name, age, job) {
	this.name = name;
	this.age = age;
	this.job = job;

	this.sayName = function() { 
		return this.name;
	}
};

var p1 = new Person('Nicolas', 29, 'Software Engineer');
var p2 = new Person('Greg', 27, 'Doctor');

//function Person(name, age, job) { this.name = name; this.age = age; this.job = job; this.sayName = function () {return this.name;}; }
println(1, Person.toString());
println(2, Person.length);//3
println(3, Person.constructor);//function Function() { [native code] }
println(4, Person.prototype.constructor == Person);//1 true;
println(5, Person.prototype.name);//undefined;
println(6, Person.prototype.age);//undefined;
println(6, Person.prototype.job);//undefined;
println(7, Person.prototype.sayName);//undefined;

println(8, Person.prototype == p1.__proto__);//2 true;
println(9, p2.__proto__ == p1.__proto__);//2 true;
println(10, p2.sayName);//function(){return this.name);
println(11, p2.sayName());//Greg
println(10, p1.sayName);//function(){return this.name);
println(11, p1.sayName());//Nicolas
println(11, p2.sayName == p1.sayName);//false

function println(i, value) {
	document.write(i + ' &nbsp;&nbsp;' + value + '<hr/>');
}
  

?

?

注意:

1. 當JavaScript解析從第一行~第九行的代碼的時候,發現時一段function聲明代碼的時候,會做如下幾個工作

A1:在heap里面生成一個Function對象代表這段function代碼

A2:給這個Function對象,這個對象會自動獲得一個prototype的屬性。這個屬性指向該對象的prototype object。默認說來,所有的prototype object都會自動獲得一個constructor的屬性,該屬性存放指向Function對象的pointer

A3:設定這個Function的名字(因為這里不是一個匿名function)

A4:在global object對象建立Person的屬性,這個屬性的值為指向Function對象的指針。

?

2. 第11行:var p1 = new Person('Nicolas', 29, 'Software Engineer'),這里function作為new的方式呼叫,javascript是如何處理的呢?

A1:首先在heap去new Object,然后以這個Object作為這段code的execute context,加入到scope chain的頭部。此時this-->這個object,然后進入code

A2:this.name = name,this.age = age,this.job=job,這三段代碼,對剛才生成的那個Object添加屬性,并賦值

A3:this.sayName = function(){...},這段會首先在heap里面生成一個function的對象,然后將該對象的pointer賦給剛才生成對象的sayName屬性上

A4:對這個object.__proto__賦值,指向function Person(name,age,job){...},然后將這個object的pointer賦值給stack里面的p1;(注意這個__proto__屬性,可以在firefox,safari,chrome等瀏覽器可以訪問,但在ie等瀏覽器則不能訪問,這是因為實現EMCScript 262的規范不同造成的)

?

?

3.第30行的輸出結果是false,為什么呢?

從上面的分析,我們可以知道在new Person的時候,執行this.sayName=function(){...},會首先去heap里面new Function Object,然后賦值給sayName,所以在p1和p2都會執行這個過程。這樣就會new 2個邏輯上相等的Function Object,但是由于他們的內存位置不同,所以在p1.sayName == p2.sayName的結果為false。這也是Contructor Pattern方式最大的問題,需要產生的Function Object太多了。

?

其內存結構為:

?


OO JavaScript
?


?
?
二,Prototype Pattern

請參看代碼:

    	function Person() {
	};

	//Person是一個Function的對象
	Person.prototype.name = 'Nicolas';
	Person.prototype.age = 29
	Person.prototype.sayName = function() {
		return this.name;
	};

	var p1 = new Person();

	var p2 = new Person();

	println(1, Person.toString());
	println(2, Person.length);
	println(3, Person.constructor);
	println(4, Person.prototype.constructor == Person);//1 true;
	println(5, Person.prototype.name);//Nicolas;
	println(6, Person.prototype.name == p2.name);//Nicolas;
	println(7, Person.prototype.sayName == p2.sayName);//Nicolas;

	println(8, Person.prototype == p1.__proto__);//2 true;
	println(9, p2.__proto__ == p1.__proto__);//2 true;
	println(10, p2.__proto__.sayName == p1.__proto__.sayName);
	println(11, p2.sayName() == 'Nicolas');
	println(12, p1.sayName == p1.sayName);
	println(13, p2.sayName() == p1.sayName());
	
	function println(i, value) {
		document.write(i + ' &nbsp;&nbsp;' + value + '<hr/>');
	}
  

?

?注意:

這里是將property和method都加到Person.prototype所指向的prototype的對象上,因為p1和p2都指向這個prototype對象的指針,所以訪問的時候,他們共享同一片內存區域。對于方法而言是共享了,但是property卻混淆在了一塊兒。參看如下的內存圖:
?
OO JavaScript
?

?

?

?

?

OO JavaScript


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久久久国产精品视频 | 国产精品视频二区不卡 | 99精品久久| 日日噜噜夜夜狠狠视频buoke | 夜精品A片观看无码一区二区 | 亚洲综合在线另类色区奇米 | 波多野结衣亚洲一区 | 黄视频网站大全 | 片在线观看免费观看视频 | 亚洲 综合 欧美 动漫 丝袜图 | 五月婷婷狠狠干 | 在线天堂中文在线资源网 | 一级成人生活片免费看 | 日韩少妇成熟A片无码专区 黄在线免费观看 | 九九久久精品 | 毛片大全免费看 | 亚洲影院在线观看 | 拍拍拍无遮挡高清视频在线网站 | 成人精品鲁一区一区二区 | 欧美精品无需播放器在线观看 | 夜色在线影院 | 久久亚洲欧美日韩精品专区 | 欧美剧场成人精品午夜 | 偷拍亚洲制服另类无码专区 | 欧美一级片在线看 | 欧美精品综合在线 | 夜色成人性y | 一级毛片免费不卡在线 | 欧美精品v国产精品v日韩精品 | 特黄级 | 韩国三级中文字幕hd久久精品 | 日日操夜夜摸 | 日韩亚洲人成网站在线播放 | 国产精品亚洲综合 | 色秀视频免费高清网站 | 成人国产精品免费视频不卡 | 色综合亚洲精品激情狠狠 | 精品国产一区二区三区久久久蜜月 | 中国人免费的片 | 国产欧美日本 | 欧美成人免费毛片 |