javascript 高级程序设计学习笔记(面向对象的程序设计) 1
Object構(gòu)造函數(shù)或?qū)ο笞置媪慷伎梢杂脕韯?chuàng)建對象,但這些方式有個明顯的缺點(diǎn):使用相同一個接口創(chuàng)建很多對象,會產(chǎn)生大量重復(fù)代碼。
工廠模式
//工廠模式function createDog (name,age) {var o = new Object();o.name = name;o.age = age;o.sayAge = function () {alert(age); };return o;} var dog1 = createDog("Bob","11");var dog2 = createDog("Ann","5");工廠模式雖然解決了創(chuàng)建多個相似對象的問題,但卻沒有解決對象識別的問題(即怎樣知道一個對象的類型)。
構(gòu)造函數(shù)模式
//構(gòu)造函數(shù)模式function Dog (name,age) {this.name = name;this.age = age;this.sayAge = function () {alert(age); };}var dog1 = new Dog("Bob","11");var dog2 = new Dog("Ann","5");這個例子中直接將方法和屬性賦給了this對象。此時函數(shù)名Dog使用的D是大寫字母,構(gòu)造函數(shù)始終應(yīng)該以一個大寫字母開頭,這主要是為了區(qū)別于ES中的其他函數(shù);因?yàn)闃?gòu)造函數(shù)本身也是函數(shù),只不過可以用來創(chuàng)建對象而已。
創(chuàng)建構(gòu)造函數(shù)的新實(shí)例,必須使用 new 操作符。
以下為創(chuàng)建步驟
1.創(chuàng)建一個新對象;
2.將構(gòu)造函數(shù)的作用域賦給新對象(this指向新對象);
3.執(zhí)行構(gòu)造函數(shù)的代碼;
4.返回新對象。
dog1和dog2分別保存著Dog的一個不同的實(shí)例。這兩個對象都有一個constructor(構(gòu)造函數(shù))屬性,該屬性指向Dog。
alert(dog1.constructor == Dog); //true alert(dog2.constructor == Dog); //trueconstructor屬性最初是用來標(biāo)識對象類型的。檢測對象類型還是用instanceof操作符更靠譜一些。
alert(dog1 instanceof Object) //true alert(dog1 instanceof Dog) //trueDog1同時也是Object的實(shí)例,是因?yàn)樗詫ο缶^承自O(shè)bject。
構(gòu)造函數(shù)也可以作為普通函數(shù)來調(diào)用
//作為普通函數(shù) Dog("Bob","11"); window.sayAge(); //"11" //在另一個對象作用域中調(diào)用 var o =new Object(); Dog.call(o,"Bob","11"); o.sayAge(); //11構(gòu)造函數(shù)的弊端:
每個方法都要在每個實(shí)例上重新創(chuàng)建一遍,這樣會占用更多的內(nèi)存,影響效率。
以這種方式創(chuàng)建的函數(shù),會導(dǎo)致不同的作用域鏈和標(biāo)識符解析。因此不同的實(shí)例上命名的函數(shù)是不相等的。
alert(dog1.sayAge == dog2.sayAge) //false原型模式
我們創(chuàng)建的每個函數(shù)都有一個prototype(原型)屬性,這個屬性是一個指針,指向一個對象。
使用prototype對象的好處是不必再構(gòu)造函數(shù)中定義對象實(shí)例的信息,而是將這些信息直接添加到prototype對象中。
function Dog(){}Dog.prototype.name = "Bob";Dog.prototype.age = "11";Dog.prototype.jump = function(){alert("跳一下");};var dog1 = new Dog();dog1.jump(); //跳一下var dog2 = new Dog();dog2.jump(); //跳一下 alert(dog1.name);alert(dog1.jump == Dog2.jump); //true原型對象的驗(yàn)證
? isPrototypeOf():
在創(chuàng)建自定義構(gòu)造函數(shù)后,原型對象默認(rèn)只會卻constructor屬性;其他方法從Object繼承而來。當(dāng)調(diào)用構(gòu)造函數(shù)創(chuàng)建新實(shí)例后,該實(shí)例內(nèi)部將包含一個指針
指向原型對象。但這個屬性對腳本是完全不可見的,它存在于實(shí)例與構(gòu)造函數(shù)的原型對象之間。
此時可以通過isPrototypeOf()方法來確定。
alert(Dog.prototype.isPrototypeOf(dog1)); //true?Object.getPrototypeOf():
alert(Object.prototypeOf(dog1) == Dog.prototype); //true alert(Object.prototypeOf(dog1).name); //"Bob"該方法可以取得對象的一個原型。
hasOwnProperty():
hasOwnProperty()方法可以檢測一個屬性是存在于實(shí)例中,還是原型中。
?所以,只有給定屬性存在于對象實(shí)例中才會返回true,這里dog1的name被一個新值屏蔽了。
?in操作符
alert("name" in dog1) //truename屬性不管是在對象上訪問到的,還是在原型中訪問到的都會返回true。要想確定屬性到底存在于對象中還是原型中可以使用以下代碼
function hasPrototypeProperty (object,name) {return !object.hasOwnProperty(name) && (name in object);}使用for-in循環(huán)可以得到所有能夠通過對象訪問的、可枚舉的屬性。
?
轉(zhuǎn)載于:https://www.cnblogs.com/jyasq/p/5685722.html
總結(jié)
以上是生活随笔為你收集整理的javascript 高级程序设计学习笔记(面向对象的程序设计) 1的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL Infobright 数据仓
- 下一篇: FK JavaScript之:ArcGI