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

歡迎訪問 生活随笔!

生活随笔

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

javascript

JS创建对象学习笔记

發布時間:2025/5/22 javascript 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JS创建对象学习笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、創建對象

1.1 工廠模式

工廠模式抽象了創建具體對象的過程,用函數來封裝以特定接口創建對象的細節。代碼如下:

function createPerson(name, age, job) {var o = new Object();o.name = name;o.age = age;o.job = job;o.sayName = function() {console.log(this.name);};return o; }var person1 = createPerson('sy', 25, 'Software Engineer') var person2 = createPerson('sansa', 25, 'Doctor')

工廠模式的優點:解決創建多個相似對象的問題

缺點:無法解決對象識別的問題,即怎樣知道一個對象的類型

1.2 構造函數模式

構造函數可以創建特定類型的對象,如果是Object和Array這樣的原生構造函數,在運行時會出現在執行環境中,此外,也可以創建自定義的構造函數,從而定義自定義對象類型的屬性和方法。

function Person(name, age, job) {this.name = name;this.age = age;this.job = job;this.sayName = function() {console.log(this.name)} }var person1 = new Person('sy', 25, 'Software Engineer') var person2 = new Person('sansa', 25, 'Doctor')

與構造函數不同之處:

沒有顯式地創建對象;直接將屬性和方法賦給了this對象;沒有return語句。

創建Person的新實例,必須使用new操作符。會經過以下步驟:

(1)創建一個新對象;

(2)將構造函數的作用域賦給新對象(因此this就指向了這個新對象);

(3)執行構造函數中的代碼(為這個新對象添加屬性);

(4)返回新對象。

person1和person2都有一個constructor(構造函數)屬性,該屬性指向Person。

person1.constructor == Person; // true

構造函數的優點:可以清楚的知道一個對象的類型

缺點:構造函數中存在方法的話,每個Person實例都包含一個不同的Function實例。ECMAScript中的函數是對象,因此每定義一個函數,就是實例化了一個對象。如果將方法移到全局作用域的話,會導致這個函數只能被某個對象調用,這讓全局作用域名不副實。而且如果對象需要定義很多方法,那就要定義很多全局函數,這樣對自定義的引用類型沒有了封裝性。

1.3 原型模式(*)

使用原型對象的好處是:可以讓所有對象實例共享它所包含的屬性和方法。創建的每個函數都有一個prototype(原型)屬性,這個屬性是一個指針,指向一個對象,prototype就是通過調用構造函數而創建的那個對象實例的原型對象。

function Person() { }Person.prototype.name = 'sy'; Person.prototype.age = 25; Person.prototype.job = 'Software Engineer'; Person.prototype.sayName = function() {console.log(this.name) };var person1 = new Person() person1.sayName() // 'sy'var person2 = new Person() person2.sayName() // 'sy'person1.sayName === person2.sayName // true

__proto__存在于實例與構造函數的原型對象之間。

Person.prototype.isPrototypeOf(person1) // true

Object.getPrototypeOf(person1) == Person.prototype // true

注:使用for-in循環時,返回的是通過對象訪問的、可枚舉的屬性,包括實例中的屬性,也包括存在于原型中的屬性。要取得對象上所有可枚舉的實例屬性,使用ES5的Object.keys()方法,這個方法接收一個對象作為參數,返回一個包含所有可枚舉屬性的字符串數組。

如果要得到所有實例屬性,無論是否可枚舉,可以使用Object.getOwnPropertyNames(Person.prototype); // ["constructor", "name"] 顯示了不可枚舉的constructor屬性

簡單的原型語法:

function Person(){ }Person.prototype = {name: 'sy',age: '25',job: 'Software Engineer',sayName: function() {console.log(name)} }

constructor屬性不再指向Person了。每創建一個函數,就會同時創建它的prototype對象,這個對象也會自動獲得constructor屬性,而這個語法,本質上完全重寫了默認的prototype對象,因此constructor屬性也就變成了新對象的constructor屬性(指向Object構造函數),不再指向Person函數。通過constructor無法確定對象的類型了。可以強制將constructor: Person,但是會導致它的[[Enumerable]]特性設置為true。實例中的指針僅指向原型,而不指向構造函數

原型模式的優點:可以共享屬性和方法

缺點:對于包含引用類型的屬性,會導致所有的對象都發生變化

1.4 組合使用構造函數模式和原型模式

構造函數模式用于定義實例屬性,而原型模式用于定義方法和共享的屬性。最大限度地節省了內存,而且這種模式支持向構造函數傳遞參數。

function Person(name, age, job) {this.name = name;this.age = age;this.job = job;this.friends = ['111', '222'] }Person.prototype = {constructor: Person,sayName: function() {console.log(this.name)} }var person1 = new Person('sy', 25, 'Software Engineer') var person2 = new Person('sansa', 25, 'Doctor')person1.friends.push('333')
console.log(person1.friends === person2.friends) // false

1.5 動態原型模式

為了將構造函數和原型封裝,動態原型模式把所有信息都封裝在了構造函數中。可以通過檢查某個應該存在的方法是否有效,來決定是否需要初始化原型。

function Person(name, age, job){// 屬性this.name = name;this.age = age;this.job = job;// 方法if(typeof this.sayName != 'function'){Person.prototype.sayName = function() {console.log(this.name)}}
}
var friend = new Person('sy', 25, 'Software Engineer') friend.sayName(); // sy

使用動態原型模式時,不能使用對象字面量重寫原型。如果在已經創建了實例的情況下重寫原型,那么就會切斷現有實例與新原型之間的聯系。

1.6 寄生構造函數模式

思想:創建一個函數,該函數的作用僅僅是封裝創建對象的代碼,然后再返回新創建的對象。

function Person(name, age, job){var o = new Object();o.name = name;o.age = age;o.job = job;o.sayName = function(){console.log(this.name);};return o; } var friend = new Person("Nicholas", 29, "Software Engineer"); friend.sayName(); //"Nicholas"

1.7 穩妥構造函數模式

穩妥對象:指的是沒有公共屬性,而且其方法也不引用this的對象。

function Person(name, age, job){// 創建要返回的對象var o = new Object();// 可以在這里定義私有變量和函數// 添加方法o.sayName = function() {console.log(name)}// 返回對象return o; } var friend = new Person("Nicholas", 29, "Software Engineer"); friend.sayName(); //"Nicholas"

?

轉載于:https://www.cnblogs.com/songya/p/11488887.html

總結

以上是生活随笔為你收集整理的JS创建对象学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 亚洲视频h| 日本免费看 | 越南少妇做受xxx片 亚洲av综合色区无码一二三区 | 蜜桃中文字幕 | 婷婷午夜激情 | 日韩中文字幕在线视频 | 日韩一级免费观看 | 久久精品视频8 | 奇米精品一区二区三区在线观看一 | 欧美成人一二三 | 97狠狠操 | 黄色一级大片免费版 | 精品国产精品国产偷麻豆 | 国产精品久久久毛片 | 精品国产免费视频 | 亚洲第一黄色 | 国产日韩大片 | 国产区视频在线 | 久草久 | 久久久久99精品成人片我成大片 | 美女黄色真播 | 国产一级片自拍 | 亚洲天堂h | av女大全列表 | 超碰伊人久久 | 理论片亚洲 | 奇米四色在线观看 | 娇妻被老王脔到高潮失禁视频 | 亚洲爱爱图 | 久爱视频在线 | 最新国产拍偷乱偷精品 | 国产成人麻豆精品午夜在线 | 日韩久久免费 | 粗大挺进潘金莲身体在线播放 | 免费黄色成人 | 亚洲高清一区二区三区 | 草碰在线| 成人欧美一区二区三区白人 | 超碰资源在线 | 亚洲精品国产99 | 欧亚成人av | 成年人看的黄色片 | 精品国产黄 | 欧美一区二区三区久久综合 | 日韩精品一区二区三区电影 | 国产女女做受ⅹxx高潮 | 无码免费一区二区三区免费播放 | 怡红院成永久免费人全部视频 | 人人爽爽人人 | 国产激情久久久久 | 欧美日韩国产在线播放 | 亚洲午夜不卡 | 亚洲一区精品视频在线观看 | 亚洲AV成人无码一二三区在线 | 日韩少妇裸体做爰视频 | 一区二区三区毛片 | 亚洲三级视频在线观看 | 99久久久无码国产精品性青椒 | 国产精品51| 日韩国产专区 | 欧美日本一区 | 哺乳期给上司喂奶hd | 少妇无内裤下蹲露大唇视频 | 91麻豆精品国产理伦片在线观看 | 牛av| 影音av资源| 国产在线视频在线观看 | 天堂一区二区三区 | 自拍偷拍激情小说 | 91av看片 | 日韩一卡二卡三卡四卡 | 男女免费观看视频 | 黄色污小说 | 美女露出粉嫩尿囗让男人桶 | 天天躁夜夜操 | 欧美片一区二区 | 国产一级片播放 | 免费av导航 | 成人小视频在线播放 | 亚洲乱码国产乱码精品精的特点 | 一区二区高潮 | 亚洲精品二区三区 | 少妇又紧又色又爽又刺激 | 6080黄色| 人人爱人人草 | 国产av无码国产av毛片 | 黄色资源在线播放 | 精品爱爱 | 国产精品免费无遮挡无码永久视频 | 欧美日日夜夜 | 婷婷午夜激情 | 长篇高h肉爽文丝袜 | 波多野结衣av片 | 天堂va蜜桃一区二区三区 | 夜夜导航 | 米奇狠狠干| 91美女视频 | 色屋永久| 亚洲在线观看视频 |