摘要:構(gòu)造函數(shù)內(nèi)部在構(gòu)造函數(shù)內(nèi)部通過(guò)用于指向當(dāng)前對(duì)象變量添加屬性或方法此處定義的屬性和方法都是為對(duì)象自身所擁有每次通過(guò)類創(chuàng)建實(shí)例時(shí)指向的屬性都會(huì)得到相應(yīng)的創(chuàng)建私有屬性只能被私有方法和特權(quán)方法訪問(wèn)私有方法在構(gòu)造函數(shù)里聲明能被私有函數(shù)特權(quán)方法訪問(wèn)只能
構(gòu)造函數(shù)內(nèi)部: tips:
在構(gòu)造函數(shù)內(nèi)部通過(guò)this(用于指向當(dāng)前對(duì)象)變量添加屬性或方法,
此處定義的屬性和方法都是為對(duì)象自身所擁有,
每次通過(guò)類創(chuàng)建實(shí)例時(shí), this指向的屬性都會(huì)得到相應(yīng)的創(chuàng)建.
var Person = function(name, sex) { // 私有屬性: 只能被【私有方法】和【特權(quán)方法】訪問(wèn) var contact = "xxxxx@qq.com"; var number = "88888888"; // 私有方法: 在構(gòu)造函數(shù)里聲明, 能被【私有函數(shù)】【特權(quán)方法】訪問(wèn), 只能訪問(wèn)【私有方法】和【私有屬性】 var getInfo = function(name, sex) { console.log("My name is " + name + ", I’m a " + sex + "!"); console.log("My email is " + contact); }; // 公有屬性 this.name = name; this.sex = sex; // 特權(quán)方法: 可以訪問(wèn)【私有屬性】【私有方法】【公有屬性】 this.intro = function() { getInfo(name, sex); }; this.getContact = function(number) { console.log(number); }; // 構(gòu)造器 this.getContact(number); };構(gòu)造函數(shù)外部: tips:
通過(guò)點(diǎn)語(yǔ)法定義的屬性和方法不會(huì)添加到新創(chuàng)建的對(duì)象,因此類的實(shí)例無(wú)法訪問(wèn), 只能通過(guò)類的自身(Person)訪問(wèn).
// 類靜態(tài)公有屬性(對(duì)象不能訪) Person.isChinese = true; // 類靜態(tài)公有方法(對(duì)象不能訪問(wèn)到) Person.speak = function() { console.log("what???"); };類的原型: tips:
一種是為原型對(duì)象屬性賦值, 另一種是將一個(gè)對(duì)象賦值給類的原型對(duì)象.
通過(guò)prototype繼承的屬性或方法是每個(gè)對(duì)象通過(guò)prototype訪問(wèn)到的,
所以每次通過(guò)類創(chuàng)建實(shí)例時(shí), 這些屬性和方法不會(huì)再次創(chuàng)建.
Person.prototype = { // 顯示指定對(duì)象的constructor屬性 constructor: Person, // 公有屬性 hobby: "reading", // 公有方法 sport: function() { console.log("run"); } }; // test: var tony = new Person("Tony", "man", "25"); console.log("--- 訪問(wèn)【公有屬性】 ---"); console.log(tony.name); // Tony console.log(tony.sex); // man console.log("--- 訪問(wèn)【特權(quán)方法】 ---"); console.log(tony.intro()); // My name is Tony, I’m a man! // My email is xxxxx@qq.com console.log("--- 訪問(wèn)【類靜態(tài)公有屬性】和【類靜態(tài)公有方法】 ---"); console.log(tony.isChinese); // undefined console.log(tony.speak()); // undefined console.log("--- 通過(guò)類自身訪問(wèn)【類靜態(tài)公有屬性】和【類靜態(tài)公有方法】 ---"); console.log(Person.isChinese); // true console.log(Person.speak()); // what??? console.log("--- 訪問(wèn)【公有屬性】及【公有方法】 ---"); console.log(tony.hobby); // reading console.log(tony.sport()); // run // 通過(guò)閉包實(shí)現(xiàn): var Person = (function() { // 靜態(tài)私有變量 var isChinese = true; // 靜態(tài)私有方法 var speak = function() {}; // 創(chuàng)建類 var _person = function() { // 私有屬性: 只能被【私有方法】和【特權(quán)方法】訪問(wèn) var contact = "xxxxx@qq.com"; var number = "88888888"; // 私有方法: 在構(gòu)造函數(shù)里聲明, 能被【私有函數(shù)】【特權(quán)方法】訪問(wèn), 只能訪問(wèn)【私有方法】和【私有屬性】 var getInfo = function(name, sex) { console.log("My name is " + name + ", I’m a " + sex + "!"); console.log("My email is " + contact); }; // 公有屬性 this.name = name; this.sex = sex; // 特權(quán)方法: 可以訪問(wèn) this.intro = function() { getInfo(name, sex); }; this.getContact = function(number) { console.log(number); }; // 構(gòu)造器 this.getContact(number); }; // 構(gòu)建原型 _person.prototype = { constructor: _person, // 公有屬性 hobby: "reading", // 公有方法 sport: function() { console.log("run"); } }; // 返回類 return _person; })();類的兩種寫法
標(biāo)準(zhǔn)原型寫法
function Person() {} Person.prototype.sayHi = function() {} var me = new Person(); console.log(me.constructor === Person); // true;
對(duì)象字面量
function Person() {} Person.prototype = { sayHi: function() {} } var me = new Person(); console.log(me.constructor === Person); // false; console.log(me.constructor === Object); // true;使用對(duì)象字面量的缺點(diǎn):
使用對(duì)象字面形式改寫原型對(duì)象改變了構(gòu)造函數(shù)的屬性,因此它現(xiàn)在指向Object而不是Person.
原因:因?yàn)樵蛯?duì)象具有一個(gè)constructor屬性,這是其他對(duì)象實(shí)例所沒(méi)有的.
當(dāng)一個(gè)函數(shù)被創(chuàng)建時(shí),它的prototype屬性也被創(chuàng)建, 且該原型對(duì)象的constructor屬性指向該函數(shù).
當(dāng)使用對(duì)象字面形式改寫原型對(duì)象Person.prototype時(shí), 其constructor屬性將被置為泛用對(duì)象Object.
在改寫原型對(duì)象時(shí)手動(dòng)重置其constructor屬性.
// 對(duì)象字面量修正: function Person() {} Person.prototype = { constructor: Person, sayHi: function() { console.log("Hi~"); } } var me = new Person(); console.log(me.constructor === Person); // true; console.log(me.constructor === Object); // false;創(chuàng)建對(duì)象的安全模式
var Person = function(name, sex) { this.name = name; this.sex = sex; }; var tony = new Person("Tony", "boy"); console.log(tony.name); // Tony console.log(tony.sex); // boy var anna = Person("Anna", "girl"); console.log(window.name); // Anna console.log(window.sex); // girl console.log(anna); // undefined console.log(anna.name); // Uncaught TypeError: Cannot read property "name" of undefinedtips:
new可以看作是對(duì)當(dāng)前對(duì)象this不停地賦值,
如果沒(méi)有new, 則會(huì)直接執(zhí)行函數(shù), 因?yàn)楹瘮?shù)在全局作用域中執(zhí)行了,
所以在全局作用域中this指向的當(dāng)前對(duì)象就自然是全局變量,
屬性都添加到window上面了;
另外一個(gè)則因?yàn)镻erson類中沒(méi)有return語(yǔ)句,
則函數(shù)執(zhí)行完沒(méi)有返回執(zhí)行結(jié)果. 所以實(shí)例對(duì)象為undefined;
// 創(chuàng)建對(duì)象的安全模式 var Person = function(name, sex) { // 判斷執(zhí)行過(guò)程中this是否是當(dāng)前對(duì)象(如果是說(shuō)明是用new創(chuàng)建的) if(this instanceof Person) { this.name = name; this.sex = sex; } else { // 否則重新創(chuàng)建這個(gè)對(duì)象 return new Person(name, sex); } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/80087.html
摘要:眾多面向?qū)ο蟮木幊趟枷腚m不盡一致,但是無(wú)論哪種面向?qū)ο缶幊陶Z(yǔ)言都具有以下的共通功能。原型編程以類為中心的傳統(tǒng)面向?qū)ο缶幊?,是以類為基礎(chǔ)生成新對(duì)象。而原型模式的面向?qū)ο缶幊陶Z(yǔ)言沒(méi)有類這樣一個(gè)概念。 什么是面向?qū)ο??這個(gè)問(wèn)題往往會(huì)問(wèn)到剛畢業(yè)的新手or實(shí)習(xí)生上,也是往往作為一個(gè)技術(shù)面試的開(kāi)頭題。在這里我們不去談如何答(fu)好(yan)問(wèn)(guo)題(qu),僅談?wù)勎宜斫獾拿嫦驅(qū)ο蟆?從歷...
摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過(guò)對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來(lái)。注意中,對(duì)象一定是通過(guò)類的實(shí)例化來(lái)的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過(guò)對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來(lái)。注意中,對(duì)象一定是通過(guò)類的實(shí)例化來(lái)的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過(guò)對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來(lái)。注意中,對(duì)象一定是通過(guò)類的實(shí)例化來(lái)的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:缺陷在子類構(gòu)造函數(shù)中執(zhí)行了一遍父類構(gòu)造函數(shù),在實(shí)現(xiàn)子類原型的類式繼承時(shí)又調(diào)用了一遍父類構(gòu)造函數(shù),因此調(diào)用了兩遍構(gòu)造函數(shù)。 類式繼承 原理 類的原型對(duì)象的作用就是為類的原型添加公有屬性和公有方法,但類不能直接訪問(wèn)這些屬性和方法,必須通過(guò)原型prototype來(lái)訪問(wèn)。而我們實(shí)例化一個(gè)父類的時(shí)候,新創(chuàng)建的對(duì)象復(fù)制了父類的構(gòu)造函數(shù)內(nèi)的屬性與方法,并且將原型__proto__指向了父類的原型對(duì)象...
閱讀 3579·2021-10-13 09:39
閱讀 1528·2021-10-08 10:05
閱讀 2355·2021-09-26 09:56
閱讀 2371·2021-09-03 10:28
閱讀 2761·2019-08-29 18:37
閱讀 2090·2019-08-29 17:07
閱讀 658·2019-08-29 16:23
閱讀 2264·2019-08-29 11:24