日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

javascript 高级程序设计学习笔记(面向对象的程序设计) 1

發布時間:2024/6/21 javascript 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 javascript 高级程序设计学习笔记(面向对象的程序设计) 1 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Object構造函數或對象字面量都可以用來創建對象,但這些方式有個明顯的缺點:使用相同一個接口創建很多對象,會產生大量重復代碼。

工廠模式

//工廠模式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");

工廠模式雖然解決了創建多個相似對象的問題,但卻沒有解決對象識別的問題(即怎樣知道一個對象的類型)。

構造函數模式

//構造函數模式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對象。此時函數名Dog使用的D是大寫字母,構造函數始終應該以一個大寫字母開頭,這主要是為了區別于ES中的其他函數;因為構造函數本身也是函數,只不過可以用來創建對象而已。

創建構造函數的新實例,必須使用 new 操作符。

以下為創建步驟

1.創建一個新對象;

2.將構造函數的作用域賦給新對象(this指向新對象);

3.執行構造函數的代碼;

4.返回新對象。

dog1和dog2分別保存著Dog的一個不同的實例。這兩個對象都有一個constructor(構造函數)屬性,該屬性指向Dog。

alert(dog1.constructor == Dog); //true alert(dog2.constructor == Dog); //true

constructor屬性最初是用來標識對象類型的。檢測對象類型還是用instanceof操作符更靠譜一些。

alert(dog1 instanceof Object) //true alert(dog1 instanceof Dog) //true

Dog1同時也是Object的實例,是因為所以對象均繼承自Object。

構造函數也可以作為普通函數來調用

//作為普通函數 Dog("Bob","11"); window.sayAge(); //"11" //在另一個對象作用域中調用 var o =new Object(); Dog.call(o,"Bob","11"); o.sayAge(); //11

構造函數的弊端:

每個方法都要在每個實例上重新創建一遍,這樣會占用更多的內存,影響效率。

以這種方式創建的函數,會導致不同的作用域鏈和標識符解析。因此不同的實例上命名的函數是不相等的。

alert(dog1.sayAge == dog2.sayAge) //false

原型模式

我們創建的每個函數都有一個prototype(原型)屬性,這個屬性是一個指針,指向一個對象。

使用prototype對象的好處是不必再構造函數中定義對象實例的信息,而是將這些信息直接添加到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

原型對象的驗證

? isPrototypeOf():

在創建自定義構造函數后,原型對象默認只會卻constructor屬性;其他方法從Object繼承而來。當調用構造函數創建新實例后,該實例內部將包含一個指針

指向原型對象。但這個屬性對腳本是完全不可見的,它存在于實例與構造函數的原型對象之間。

此時可以通過isPrototypeOf()方法來確定。

alert(Dog.prototype.isPrototypeOf(dog1)); //true

?Object.getPrototypeOf():

alert(Object.prototypeOf(dog1) == Dog.prototype); //true alert(Object.prototypeOf(dog1).name); //"Bob"

該方法可以取得對象的一個原型。

hasOwnProperty():

hasOwnProperty()方法可以檢測一個屬性是存在于實例中,還是原型中。

function Dog(){}Dog.prototype.name = "Bob";Dog.prototype.age = "11";Dog.prototype.jump = function(){alert("跳一下");};var dog1 = new Dog();var dog2 = new Dog();alert(dog1.hasOwnProperty("name")); //false dog1.name = "Gina";alert(dog1.name); //"Gina"alert(dog1.hasOwnProperty("name")); //truealert(dog2.hasOwnProperty("name")); //false--來自原型

?所以,只有給定屬性存在于對象實例中才會返回true,這里dog1的name被一個新值屏蔽了。

?in操作符

alert("name" in dog1) //true

name屬性不管是在對象上訪問到的,還是在原型中訪問到的都會返回true。要想確定屬性到底存在于對象中還是原型中可以使用以下代碼

function hasPrototypeProperty (object,name) {return !object.hasOwnProperty(name) && (name in object);}

使用for-in循環可以得到所有能夠通過對象訪問的、可枚舉的屬性。

?

轉載于:https://www.cnblogs.com/jyasq/p/5685722.html

總結

以上是生活随笔為你收集整理的javascript 高级程序设计学习笔记(面向对象的程序设计) 1的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。