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