對JavaScript中的靜態屬性和原型屬性的理解


首先是在訪問上的區別,當訪問實例對象的某個屬性但它本身沒有時,它就會到原型中去查找,但不會去查找靜態屬性。

// 實例對象不會去查找靜態屬性
function Foo(){}
Foo.a = 1;
var foo = new Foo();
foo.a // undefined

// 當實例對象沒有某個屬性時,會嘗試去原型中查找
function Foo(){}
Foo.prototype.a = 1;
var foo = new Foo();
foo.a // 1

靜態方法中的this指向調用它的對象,比如在下面代碼中指向的就是調用它的Foo,原型方法中的this指向實例對象

function Foo(){}
Foo.fn = function(){
	console.log(this);
};
Foo.prototype.fn = function(){
	console.log(this);
};
var foo = new Foo();
foo.fn(); // Foo {}
Foo.fn(); // function Foo(){}

靜態屬性和原型屬性的區別就在於this的指向以及查找規則上,但this的指向問題並不是最重要的,拿實現鏈式調用來說

// 通過原型實現鏈式調用
function Foo(){}
Foo.prototype.a = function(){
	console.log('a');
	return this;
};
Foo.prototype.b = function(){
	console.log('b');
	return this;
};
var foo = new Foo();
foo.a().b(); // a b

// 通過靜態方法實現鏈式調用
function Foo(){}
Foo.a = function(){
	console.log('a');
	return this;
};
Foo.b = function(){
	console.log('b');
	return this;
};
Foo.a().b(); // a b

最大的區別還是在查找規則上,在原型上添加屬性可以當做默認屬性來使用

function Foo(){}
Foo.prototype.a = 1;
var foo = new Foo(),
	foo2 = new Foo();
foo2.a = 2;
foo.a // 1
foo2.a // 2

每個實例對象都可以擁有自己的屬性和方法,在沒有設置的情況下才會去嘗試使用prototype上的屬性和方法,而靜態方法是無法實現這種效果的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM