JS 建構函式 原型 new

2021-09-23 14:27:50 字數 2631 閱讀 4234

1、每個函式都有乙個prototype屬性,該屬性指向函式的原型物件,原型物件的用途是可以讓所有物件例項共享它所包含的屬性和方法。

2、預設情況下,每個原型物件都會自動獲得乙個constructor屬性,該屬性指向prototype屬性所在的函式。constructor屬性最初是用來標識物件型別的,但檢測物件型別,還是instanceof更可靠些(因為物件的constructor可被改寫,指向的函式不同於原型物件construtor指向的函式):

person1 instanceof person // 檢測person.prototype是否在person1的原型鏈上,在就返回true。
3、當呼叫建構函式建立乙個物件例項後,該例項的內部將包含乙個指標[[prototype]](內部屬性),指向建構函式的原型物件。firefox、safari和chrome等瀏覽器在每個物件上都加了乙個__proto__,來訪問[[prototype]],而在其他實現中,這個屬性則完全不可見。物件例項和建構函式沒有直接關係。可以通過isprototypeof()來確定是否為物件的原型物件:

person.prototype.isprototypeof(person1);
es5中增加了新方法object.getprototypeof(),返回[[prototype]]的值(ie 9+,firefox 3.5+,safari 5+,opera 12+,chrome):

object.getprototypeof(person1) === person.prototype // true
,使用delete操作符可以刪除例項屬性,從而能重新訪問原型中的屬性。

function person() {}

person.prototype.name = 'nicholas';

person.prototype.sayname = function ()

let person1 = new person();

let person2 = new person();

person1.name = 'greg';

alert(person1.name); // 'greg'

alert(person2.name); // 'nicholas'

delete person1.name;

alert(person1.name); // 'nicholas

hasownproperty():若屬性為例項屬性,返回true:

person1.hasownproperty('name') // 如果person1例項本身有name屬性,返回true
in操作符:無論該屬性在例項中還是原型中,只要能通過物件訪問,就返回true。

'name' in person1 // 檢測person1是否有name屬性,無論是例項還是原型屬性
for-in: 返回的是所有能通過物件訪問的、可列舉的屬性,包括例項屬性和原型屬性。遮蔽了原型中不可列舉屬性的例項屬性也會被返回,因為按規定,開發人員定義的屬性都是可列舉的(ie8及更早版本中例外)。

object.keys():返回物件上所有可列舉的例項屬性(ie 9+,firefox 4+,safari 5+,opera 12+ 和 chrome)。

object.getownpropertynames():返回物件上所有例項屬性,包括不可列舉的(ie 9+,firefox 4+,safari 5+,opera 12+ 和 chrome)。

建立乙個空的js物件,即{};

將該空物件[[prototype]]屬性鏈結到建構函式的原型物件 ;

將步驟1新建立的物件作為this的上下文 ;

執行建構函式內的**(為這個新物件新增屬性);

如果該函式沒有返回物件,則返回this

用**示意,記函式a為建構函式, new a() 實際做了如下事情:

let obj = {};

obj.__proto__ = a.prototype;

return a.call(obj) || obj;

1、new的過程中並不涉及constructor屬性。改變a.prototype.constructor,也不影響new a()的執行過程:

function a () 

function b ()

b.prototype.constructor = a;

let b = new b(); // 'b'

console.log(b.__proto__ === b.prototype); // true

console.log(b.construtor === a); // true

2、new a也可以建立例項,和new a()的區別是new a不可以傳入引數。

new建構函式和原型鏈

new建構函式functionpeople name,age 這個函式是不是建構函式?他沒有被呼叫,用new呼叫後就是建構函式,不被new呼叫就不是建構函式 functionpeople name,age varobj people 小明 12 alert obj null alert obj.ag...

JS 原型constructor建構函式

一 物件原型 proto 和建構函式原型物件prototype都有乙個屬性,叫做constructor,稱之為建構函式,主要記錄該物件引用了哪個建構函式,可以讓原型物件重新指向原來的建構函式,這就是為什麼在例項物件中傳遞引數時,建構函式本身不需要寫return返回結果的原因 為了更清晰的看到是否為建...

js建構函式和原型

建立物件的方式 1,物件字面量 var obj1 2,new object var obj2 new object 3,利用建構函式建立物件 建構函式 利用建構函式 可以建立很多個物件 建構函式,把物件中公共屬性和方法抽出來,放在建構函式裡,通過new建立不同的物件 function star na...