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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

面向对象-原型对象

發布時間:2023/12/1 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面向对象-原型对象 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

創建對象

Js中可以用構造函數模式創建對象,如:

function Person(name, age, job) {this.name = name;this.age = age;this.job = job;this.sayName = function () {alert(this.name);}}var person1 = new Person("Nicholas", 29, "aa");var person2 = new Person("YU", 29, "BB");

這里應注意函數名首字母應大寫,按照約定,構造函數始終都應該以一個大寫字母開頭,而非構造函數則應以一個小寫字母開頭。

原型對象

上述方法中,有一個缺點,就是對象中的sayName方法,每次都會重新new一個對象,因此,也就是說不同對象的sayName方法地址是不同的,然而這個方法都只是執行提示姓名,這種創建兩個相同的function,完成同樣的任務,確實沒有必要。所以這存在了缺陷。使用下面的方法可以避免這種缺陷。

????

function Person() {}Person.prototype.name = "YuKaifei";Person.prototype.age = 25;Person.prototype.job = "SoftWare";Person.prototype.sayName = function () {alert(this.name);}var person1 = new Person();person1.sayName();//YuKaifeivar person2 = new Person();person2.sayName(); //YuKaifei alert(person1.sayName == person2.sayName); //true

?

理解原型對象

函數

Person

prototype

指向所對應的原型對象

?

函數的原型對象

Person? Prototype? (person的原型對象)

constructor

指向所對應函數(person)的指針

Name

“YuKaiFei”

Age

25

Job

“Soft Ware”

sayName

(function)

?

自定義函數1

Person1

prototype

指向所對應的原型對象

?

自定義函數2

Person2

prototype

指向所對應的原型對象

?

無論什么時候,只要創建了一個新函數,就會為該函數創建一個prototype屬性,這個屬性就指向所對應的原型對象。而默認情況下,原型對象的constructor屬性會指向所對應函數的地址。也就是說這時這兩個對象各有一個屬性,是存放對方的地址的。

當調用一個構造函數創建一個新實例之后,該函數內部也有一個屬性prototype,這個屬性是執行原型對象的地址。也就是說新實例其實與構造函數并沒有直接關系。

需要注意的是,新實例雖然沒有屬性和方法,但是卻可以通過查找對象屬性的方式來調用原型對象中的屬性和方法。

?

當新的實例創建新的屬性之后,如果和原型對象是相同的屬性,那么在下次調用時會調用新實例的屬性,而不是原型對象的屬性。如:

var person1 = new Person();person1.name="aaaa";var person2 = new Person();alert(person1.name);//aaaa alert(person2.name);//YuKaifei

?

in 操作符

有兩種方式可以使用in,一種是單獨in,一種是for-in,需要注意的是,無論該屬性是存在于實例中還是存在于原型中,只要存在,就返回true。

例如 alert(name in person1)? 返回true

for (var prop in person1) {if (prop == "name") {alert("name")}}

?

判斷該屬性是否存在實例中的方式是hasOwnPropery()方法。

例如:person1.hasOwnProperty(“Name”) 返回true

???????? Person2.hasOwnProperty(“Name”) 返回false

?

獲取對象上所有可枚舉的實例屬性:

var keys = Object.keys(Person.prototype);alert(keys); //name,age,job,syName,注意keys是一個數組。

更簡單的原型語法—存在缺陷

Person.prototype = {name: "Nicholas",age: 29,jon: "SowfWare",syaName: function () {alert(this.name);}}

可以使用這種方法更簡單的創建原型,但需要注意的是,這種寫法相當于重寫了原型對象,所有consturctor屬性是新的,即不在指向person。如:

function Person() {}var friend = new Person();Person.prototype = {name: "Nicholas",age: 29,jon: "SowfWare",syaName: function () {alert(this.name);}}friend.sayName(); //error

?

上面代碼會報錯,原因在與重寫了原型對象,指向丟失,也就是切斷了現有原型與之前已經存在的對象之間的聯系。如果避免這種方法可以在聲明原型中指定: constructor:Person

原生對象的原型—String、Array

原型的模式體現在所有原生的引用類型,例如object、array、string等,都在其構造函數的原型上定義了方法,例如在Array.prototype中可以找到sort()方法,在string.prototype可以找到substring()方法。

通過原生對象的原型,不僅可以獲得所有默認方法的引用,也可以隨意的修改原生對象的原型,因此可以隨時添加方法。例如:

為String添加一個名為startsWith()?方法。

String.prototype.startsWith = function (text) {return this.indexOf(text) == 0;}var msg = "Hello world!";alert(msg.startsWith("Hello")); //true

優化原型對象的缺陷

原型對象為了省略函數傳遞初始化這一環節,結果所有的實例在默認情況下都會取得相同的值,這對于值類型屬性共享還可以,但是對于引用類型則會存在問題。如:

?

function Person() {}Person.prototype = {name: "Nicholas",age: 29,jon: "SowfWare",friends:["Yu","Kai"],syaName: function () {alert(this.name);}}var person1 = new Person;person1.name = "yy";var person2 = new Person;
alert(person1.name);
//yy alert(person2.name); //Nicholas person1.friends.push("Fei");alert(person1.friends); //YuKaiFei alert(person2.friends); //YuKaiFei

可以看到值類型并沒有什么影響,但因為引用類型的特殊,所有實例的值都將會被改變。

所有最好采用動態原型模式

動態原型模式-聲明原型的推薦方式

function Person(name, age, job) {this.name = name;this.age = age;this.job = job;this.friends = ["Yu", "kai"];if (typeof this.sayName != "function") {this.sayName = function () {alert(this.name);};}}var f1 = new Person("Y", 29, "s");var f2 = new Person("Y", 29, "s");f1.friends.push("Fei");alert(f1.friends); //yu,kai,fei alert(f2.friends);//yu,kai

?

轉載于:https://www.cnblogs.com/y8932809/p/5386925.html

總結

以上是生活随笔為你收集整理的面向对象-原型对象的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 免看一级片 | 国产又粗又猛视频免费 | 疯狂做爰的爽文多肉小说王爷 | 欧美成网站 | 日本一二三区视频在线 | 99久久精品免费看国产免费软件 | 欧美无砖专区免费 | 尤物视频在线观看免费 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 献给魔王伊伏洛基亚吧动漫在线观看 | 亚洲一二三四在线观看 | 欧美精品久 | 国产ts网站 | 少妇不卡视频 | 成人激情视频在线观看 | 九月婷婷丁香 | 被扒开腿一边憋尿一边惩罚 | 中文字幕二区在线观看 | 在线观看免费视频 | 国产又爽又黄无码无遮挡在线观看 | 男女激情大尺度做爰视频 | 好男人天堂网 | 我要看一级片 | 欧美性xxxx图片 | 国产在线高清 | 97免费看 | 超碰免费公开在线 | 尤物视频在线观看国产性感 | 黄色91 | 午夜av激情| xxxxx黄色片| 在线麻豆| 秋霞网一区二区 | 嫩草私人影院 | 福利在线一区二区三区 | 天天干天天色天天 | av电影在线播放 | 亚洲精品一区二区三区影院忠贞 | 欧美福利一区 | 学生调教贱奴丨vk | 三级成人网| 温柔少妇的高潮呻吟 | 96看片| 日本三级在线视频 | 亚洲成人 av | 午夜视频免费在线 | 久色视频在线 | 国产熟妇另类久久久久 | 久久r这里只有精品 | 国产又粗又猛又爽又黄 | 波多野结衣一区二区三区四区 | www.香蕉.com| 日本一区高清 | 青青青在线视频免费观看 | 亚洲精品一 | 人人干人人干 | 日日摸日日添日日碰9学生露脸 | 中文区中文字幕免费看 | 玖玖在线| 无码精品视频一区二区三区 | 日韩欧美123| 亚洲成人18| 精品国产一区一区二区三亚瑟 | 激情婷| 久草视频在线免费 | 成人av一区二区三区在线观看 | 天堂91| 寂寞午夜影院 | 日本特黄视频 | 中出av在线| 男人操女人下面 | 久久亚洲av午夜福利精品一区 | 国产精品av一区 | 7799精品视频天天看 | 欧洲精品二区 | 欧美色偷偷| 日韩电影一区二区 | 热久久中文 | 日韩在线欧美 | 日韩在线视频免费 | 午夜精品久久久久久久四虎美女版 | 免费在线观看一区二区 | 国产a一区二区三区 | 亚洲av无码久久精品狠狠爱浪潮 | 午夜涩涩| 亚洲精品天堂成人片av在线播放 | 日韩激情成人 | 秋霞99| www噜噜噜 | 密桃av在线 | 国产亚洲精品成人 | 日韩三级中文 | 一级全黄裸体片 | 黄色网址你懂的 | 青草精品| av性天堂网 | 精品一区二区在线观看视频 | 欧美一区二区在线视频观看 | 激情五月综合色婷婷一区二区 |