函式的prototype屬性
給原型物件新增屬性(一般都是方法)
函式的prototype屬性: 在定義函式時自動新增的, 預設值是乙個空object物件
物件的__proto__屬性: 建立物件時自動新增的, 預設值為建構函式的prototype屬性值
所有函式都是function的例項(包含function自己),所以所有函式既可以是建構函式也可以是例項物件,也就是說所有函式中中既有__proto__也有prototype
為什麼father.constructor !== father.prototype.constructor?
function person(area)
person.prototype.sayarea = function()
var father = function(age)
father.prototype = new person('beijin');
console.log(person.prototype.constructor) //function person()
console.log(father.prototype.constructor); //function person()
father.prototype.constructor = father; //修正
console.log(father.prototype.constructor); //function father()
var one = new father(25);
----------------------------------------
father.prototype.constructor = father,這裡修正了的father的constructor。
我們知道prototype下的constructor屬性返回對建立此物件的函式的引用。
為什麼需要修正father.prototype.constructor = father?
var man;
(function()
father.prototype.sayname= function ()
man = new father('aoyo');
})()
man.sayname();//aoyo
console.log(father); //father is not defined
上述**中father在閉包中,所有我們不能直接訪問,當我們想對father類增加方法時可以通過
man.constructor.prototype.sayage = function(age)
man.sayage('20'); //20
並且如果像上面一樣father.prototype = new person('beijin')同時不進行修正,我們的方法將會新增到person類,而不是father類。
(1)
function f()
var obj = new f();
console.log(obj.prototype);//列印undefined 物件只有 __proto__屬性沒有prototype屬性,函式才有
(2)
object.prototype.a = 1;
var obj = ;
for(var i in obj)
(3)
object.prototype.a = 1;
var obj = ;
console.log(obj.a);//1
console.log('b' in obj);//true //能找到處於原型鏈裡面的bar屬性
console.log(obj.hasownproperty('a'));//false 不是自身的屬性
console.log(obj.hasownproperty('b'));//true 是自身的屬性
(4)
function a()
function b(a)
function c(a)
}a.prototype.a = 1;
b.prototype.a = 1;
c.prototype.a = 1;
//例項物件都能訪問建構函式的原型物件,可以明確的是以上3個都是能拿到a的
console.log(new a().a);//1 拿到的是原型上的a=1
console.log(new b().a);//undefined this.a = a;將new b()這個例項物件的a屬性這是為undefined,所以拿到的是undefined
console.log(new c(2).a);//2 將new c(2)這個例項物件的a屬性這是為2,所以拿到的是2
(5)
function a ()
a.prototype.n = 1;
var b = new a();//b例項物件已經建立原型連線
//原型物件指向被改變,不會切斷b例項物件的
a.prototype =
var c = new a();//c例項物件將根據新的原型建立連線
console.log(b.n, b.m); //1 undefined 這裡拿到是改變prototype之前的
console.log(c.n, c.m); //2 3 這裡拿到是改變prototype之後的
(6)
var f = function(){};
object.prototype.a = function()
function.prototype.b = function()
var f = new f();
f.a(); //列印a 物件都能訪問object.prototype中的屬性和方法
f.b(); //列印b f是函式,原型鏈 f => f.__proto__ => function.prototype => function.prototype.__proto__ => object.prototype
f.a(); //列印a 物件都能訪問object.prototype中的屬性和方法
f.b(); //報錯f.b is not a function 因f是f例項物件,原型鏈 f=>f.__proto__=>f.prototype=>f.prototype.__proto__ => object.prototype
JS原型鏈的一些理解
關於原型鏈我的理解是乙個建構函式的原型作為另乙個建構函式的例項形成的繼承關係 在js高階程式設計中有這樣乙個圖 當我們定義乙個函式時會有乙個原型,即圖中的supertype prototype,這時原型物件中會有乙個constructor指向建構函式supertype,這便是建構函式與原型物件之間的...
js理解原型高程的一些筆記
在js中建立的每個函式都有乙個 prototype 原型屬性,這個屬性是乙個物件。按字面意思,prototype是通過呼叫構造方法而建立的那個物件的原型物件。原型模式 function person person.prototype.name mike person.prototype.age 21...
關於原型的一些補充
以前要訪問原型,必須使用建構函式來實現,無法直接使用例項物件來訪問原型 火狐最早引入屬性 proto 表示使用例項物件引用原型.但是早期是非標準的。通過該屬性可以允許使用例項物件直接訪問原型 function person 神秘物件就是 person.prototype 那麼只有使用 建構函式 才可...