關於建構函式,我想到乙個比方。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.返回這個新物件 靜態成員與例項成員 靜態成員 由構造本身建立的成員 只能由建構函式本身來訪問 例項成員 在建構函式內部建立的物件成員為例項成員 只能由例...