js原型,原型鏈,call apply

2021-10-05 19:27:17 字數 3743 閱讀 4952

目錄

1.prototype原型

2.__proto__

2.1常見錯誤

3.原型鏈

3.1 object.prototype是大部分物件的最終原型

3.2 object.create()

定義:原型是function物件的乙個屬性,它定義了建構函式製造出來的物件的公共祖先,通過該建構函式產生的物件,可以繼承該原型的屬性和方法,原型也是物件。

初步看的時候,感覺類似於c++繼承

例子如下:

person.prototype.name = 'chen';

function person()

var person1 = new person;

var person2 = new person;

console.log(person1.name);//列印chen

console.log(person2.name);//列印chen

利用原型的特點,可以提取共有屬性;

原型的增刪改查不能用子類的,得直接修改 prototype。

而且 prototype 自帶建構函式,如下:

function person(){}

var person1 = new person;

console.log(person1.constructor);

//列印 person(){},查詢父函式

而且建構函式可以人為修改;

function person(){}

function code(){}

person.prototype =

var person1 = new person;

console.log(person1.constructor);//列印code(){}

仔細看列印結果的話,實際上還有乙個隱式的變數,__proto__;

這個變數是指向父元素,例子如下:

function person(){}

var person1 = new person;

console.log(person1.__proto__);

//列印

//列印的展開為:

/*constructor: ƒ person()

__proto__: object

*/

__proto__變數,當我們呼叫後代的屬性,但是後代並沒有定義該屬性的時候,就利用__proto__尋找公共祖先prototype是否包含該屬性,例子很簡單:

function person(){}

person.prototype.name = 'chen';

var person1 = new person;

console.log(person1.name);

//列印chen,person1未定義,通過__proto__尋找prototype裡是否含有

所以我們也可以修改 __proto__改變指向的祖先,如下:

function person()

person.prototype.name = 'chen';

var code =

var person1 = new person;

person1.__proto__ = code;

console.log(person1.name);//列印23333,祖先換成code

**如下:

person.prototype.name = 'chen';

function person(){}

var person1 = new person;

person.prototype =

console.log(person1.name);//列印chen

這裡可以理解為: person1 建立的時候 ,__proto__指向 person.prototype 這塊空間,當 person.prototype 被賦予了新的空間時,__proto__指向的仍舊是原來的那塊空間,所以列印的還是原來的結果;

看**即可:

grand.prototype.lastname = 'code';

function grand()

var grand = new grand();

father.prototype = grand;

function father()

var father = new father();

son.prototype = father;

function son()

var son = new son();

console.log(son.habbit);

console.log(son.name);

console.log(son.lastname);//利用 __proto__ 實現原型鏈

console.log(grand.prototype);//可以檢視 grand 的 __proto__ 是 object

//下面兩個列印相同,說明 grand.prototype.__proto__ = object.prototype

是所有物件的最終原型

console.log(grand.prototype.__proto__);

console.log(object.prototype);

所以物件可以呼叫 object.prototype 的方法,包括tostring等等;

這個方法是建立乙個新物件,使用現有的物件來提供新建立的物件的__proto__;

上面說object.prototype是大部分物件的最終原型,肯定會有特例,特例就可以用object.create()創造;

var obj1 = {};

console.log(obj1);//展開 __proto__ : object

var obj2 = object.create(null);

console.log(obj2);//展開顯示空

兩者都是改變 this 指向

呼叫乙個物件的乙個方法,用另乙個物件替換當前物件。例如:b.call(a, args1,args2);即a物件呼叫b物件的方法.

利用別人的方法實現自己的功能。

function person(name,age)

var person = new person('code',100);

var obj = {}

person.call(obj,'xiaoming',20);

console.log(obj.name);//列印xiaoming

console.log(obj.age);//列印20

常見用法:

function person(name,age,***)

//用person方法實現 student 的部分功能

function student(name,age,***,tel,grade)

call:需要把實參按照形參的個數傳進去;

JS 物件 JS原型 原型鏈

參考學習 js物件 構造器函式 建立物件的函式。物件分為普通物件和函式物件。所有物件都有 proto 屬性 函式物件不止有 proto 屬性,還有prototype屬性 稱為原型物件 1.new function 產生的物件都是函式物件。2.所有函式物件的 proto 都指向function.pro...

js 原型與原型鏈

5條原型規則 1.所有的引用型別 陣列 物件 函式 都具有物件特性,即可自由擴充套件屬性 除了 null 除外 2.所有的引用型別 陣列 物件 函式 都有乙個 proto 隱式原型 屬性,屬性值是乙個普通的物件。3.所有的函式,都有乙個prototype 顯式原型 屬性,屬性值也是乙個普通的物件。4...

JS原型物件,原型鏈

js中建立物件都是通過建構函式建立的,所以每個物件中都有乙個指向其建構函式的指標constructor var obj new object var arr new array var obj2 字面量建立實質上是上面方式的簡寫 var arr2 var str new string test 建立...