原型
在JS中 函式是一個包含屬性和方法的Function型別的物件 原型prototype就是Function型別物件的一個屬性
每個函式都有一個prototype屬性, 它預設指向一個Object空物件---即:原型物件
原型物件中有一個屬性constructor, 它指向函式物件
原型是用於儲存物件的共享屬性和方法的 原型的屬性和方法並不會影響函式本身的屬性和方法
function fn(){
return 'hello'
}
console.log(typeof fn.prototype) //object
獲取原型
- 通過建構函式的prototype屬性
function fn(){
console.log('this is a function')
}
console.log(fn.prototype); //{constructor: ƒ}
- 通過Object物件的getgetPrototypeOf()方法
function fn(){
console.log('this is a function')
}
console.log(Object.getPrototypeOf(fn)); //ƒ () { [native code] }
原型的屬性和方法
- 原型的屬性和方法單獨進行定義
建構函式.prototype.屬性名 = 屬性值
建構函式.prototype.方法名 = function(){
}
- 直接為原型定義一個新物件
建構函式.prototype = {
屬性名:屬性值,
方法:function(){}
}
自有屬性與原型屬性
自有屬性:通過物件的引用新增的屬性
原型屬性:從原型物件中繼承而來 如果原型物件中屬性值改變 則所有繼承
自該原型的物件屬性都改變
function Person(name){
//建構函式本身的屬性 --> 自有屬性
this.name = name;
}
//通過建構函式Person的prototype新增屬性 --> 原型屬性
Person.prototype.age=29
var man=new Person('林更新');
console.log(man.name); //林更新
console.log(man.age) //29
var woman=new Person('宋佳');
woman.age=38;
console.log(woman.name) //宋佳
console.log(woman.age) //38
Person.prototype.age=18;
console.log(man.age) //18
console.log(woman.age) //38
檢測自有 原型屬性
- 使用hasOwnProperty()方法檢測物件是否具有指定的自有屬性
function Person() {
}
var man =new Person()
console.log(man.hasOwnProperty("name")) //false
- 使用in關鍵字檢測物件及其原型鏈中是否具有指定屬性
function Person() {
}
var man =new Person()
console.log("name" in man) //false
顯示原型物件和隱式原型物件
- 每個函式function都有一個prototype,即顯式原型
- 每個例項物件都有一個__proto__,可稱為隱式原型
- 物件的隱式原型的值為其對應建構函式的顯式原型的值
- 函式的prototype屬性: 在定義函式時自動新增的, 預設值是一個空Object物件
- 物件的__proto__屬性: 建立物件時自動新增的, 預設值為建構函式的prototype屬性值
- 我們能直接操作顯式原型, 但不能直接操作隱式原型(ES6之前)
function Person() {
this.name='MasterYi'
}
Person.prototype.age=100;
var man=new Person;
console.log(man.prototype); // undefined 表示物件中不存在該屬性
console.log(man.__proto__); // {age: 100, constructor: ƒ}
原型鏈
- 訪問一個物件的屬性時,先在自身屬性中查詢,找到返回
- 如果沒有, 再沿著__proto__這條鏈向上查詢, 找到返回
- 如果最終沒找到, 返回undefined
- __proto__這條原型查詢鏈就是原型鏈: 隱式原型鏈
- 讀取物件的屬性值時: 會自動到原型鏈中查詢
- 設定物件的屬性值時: 不會查詢原型鏈, 如果當前物件中沒有此屬性, 直接新增此屬性並設定其值
- 方法一般定義在原型中, 屬性一般通過建構函式定義在物件本身上
作用:用來查詢物件的屬性(方法)