關於建構函式和原型的實驗筆記

2022-03-13 18:52:07 字數 2645 閱讀 1028

關於建構函式,我想到乙個比方。b 本是b生的,但是b斷絕了和他的母子關係, a無子女,決定領養b,於是a就成了b的繼母,也就是b法律上的媽媽。你問b的媽媽叫什麼, 就相當於問b的建構函式是誰。這種關係很容易改變,立個什麼字據或證明就可以了。 而原型就相當於是b身上的基因,這是領養這種關係改變不了的,屬於先天得到的。 除非把它的基因都給改了,那時自然也就驗出b是它的親媽了。

//學校

function school (name)

} //新增到原型上的屬性

school.prototype.students = ;

//學校功能--介紹

school.prototype.show = function())

} //學校功能---招聘老師

school.prototype.recruit = function(name)

//學校功能---招生

school.prototype.enroll = function(name)

//通過建構函式的方式建立物件

var ts = new school('tsinghua university');//此時school就是ts的建構函式

var bj = new school('beijin university');//此時school就是bj的建構函式

//通過建構函式建立的物件,注意兩個問題

//1 建構函式內的屬性和方法是不被共享的

//2 原型上的屬性和方法是共享的

ts.recruit('frog'); // frog 是ts這個學校的老師

bj.recruit('aaron'); // aaron 是bj這個學校的老師

ts.show(); // frog只出現在ts中

bj.show(); //aaron只出現在bj中

//說明建構函式內宣告的屬性不被共享

console.log(bj.teachers === ts.teachers); // false

//說明建構函式內宣告的方法不被共享

console.log(bj.level === ts.level);//false;

//說明teachers放在建構函式內是對的,各學校的老師互不影響

ts.enroll('tom'); //只給ts學校招生

console.log(bj.students) //ts學校沒有招生,也有這個學生了

bj.enroll('jek');

console.log(ts.students) //bj學校招的學生,在ts也有

//說明原型上的方法是共享的

console.log(bj.enroll === ts.enroll) // true

//說明原型上的屬性是共享的

console.log(bj.students === ts.students) // true;

//小結: 方法盡量寫在原型上,可以節省資源,引用型別的屬性盡量寫在建構函式內,避免汙染;

//建構函式的問題

function a()

function b()

var a = new a;

console.log(a.constructor===a) // true

//用a的例項物件替換b的原型物件

b.prototype = new a;

var b = new b;

console.log(b.constructor===b) // false

console.log(b.constructor===a) // true

//說明重寫原型物件會產生建構函式指向的問題

//修正建構函式為b

b.prototype.constructor = b;

console.log(b.constructor===b) //true

//constructor是掛在prototype上的,重寫prototype,也會自動改寫constructor

console.log(b.isprototypeof(b)) //false;

console.log(object.getprototypeof(b)) // a

//修正contructor也改變不了prototype的引用關係

//這種寫法也會產生b的建構函式指向有問題

b.prototype =

//推薦這樣寫

a.prototype.getname = function()

function c()

c.prototype.getage= function()

var c = new c;

//只改變建構函式

c.prototype.constructor = a;

console.log(object.getprototypeof(c)) // a

console.log(c.isprototypeof(c)) // false

console.log(c.isprototypeof(a)) // false

console.log(c) //c;

// undefined

c.getage(); //c age 18

//小結: 只要改變了物件的原型,那麼它的造函式就會自動改變,

//只改變建構函式的指向,原型的判斷不準確了,但是沒有被改寫。

js關於原型建構函式和原型鏈的理解

js的物件導向方式的函式有很多種方式,其中有兩個比較重要的是兩種方式一是建構函式模式,一是原型模式。1 建構函式模式如 function persion name,age var person1 new person alex 29 person1.sayname alex var person2 ...

建構函式和原型

function student name,age student.prototype var zs new student 張三 18 我們先來看一張圖 在這張圖里student建構函式的prototype指向student原型物件,student原型物件又指向student建構函式,zs物件.p...

建構函式和原型

new的時候做的的4個事情 1.在記憶體中建立乙個新的空物件 2.讓this指向這個新物件 3.執行建構函式裡的 給這個新物件 新增屬性和方法 4.返回這個新物件 靜態成員與例項成員 靜態成員 由構造本身建立的成員 只能由建構函式本身來訪問 例項成員 在建構函式內部建立的物件成員為例項成員 只能由例...