如果建立方法時,不應該在建構函式內部建立;而應在外部建立,在建構函式內部呼叫,這樣會節省很多空間。
舉例解釋:
問題:建立乙個persion的建構函式,為每乙個物件都新增sayname方法
如果在建構函式內部建立(如例1),則建構函式每執行一次,就會建立乙個新的sayname方法,而這是完全沒必要的,它們可以共享同乙個(如例2)。
//例1:修改前
function
persion
(name, age, gender);}
//建立乙個persion的例項
var per =
newpersion
("孫悟空",18
,"男");
var per2 =
newpersion
("豬八戒",19
,"男");
console.
log(per.sayname == per2.sayname)
;//返回結果是false
然而,將函式定義在全域性作用域,又會出現新問題://例2:修改後
function
persion
(name, age, gender)
//將sayname方法在全域性作用域中定義
function
fun();
//建立乙個persion的例項
var per =
newpersion
("孫悟空",18
,"男");
var per2 =
newpersion
("豬八戒",19
,"男");
console.
log(per.sayname == per2.sayname)
;//返回結果是ture
汙染了全域性作用域的命名空間,而且也不安全
解決辦法:使用原型物件
我們所建立的每乙個函式,解析器都會向函式中新增乙個屬性prototype,這個屬性對應著乙個物件,這個物件就是我們所謂的原型物件
如果函式作為普通函式呼叫prototype沒有任何作用
當函式以建構函式的形式呼叫時,它所建立的物件中都會有乙個隱含的屬性指向該建構函式的原型物件,我們可以通過__proto__(前後都是兩個下劃線)來訪問該屬性
原型物件就相當於乙個公共的區域,所有同乙個類的例項都可以訪問到這個原型物件,我們可以將物件中共有的內容,統一設定到原型物件中。
新增語法:
訪問順序://新增屬性
建構函式名.prototype.屬性 = 屬性值;
//新增方法
建構函式名.prototype.方法=
function()
;
當我們訪問乙個物件的屬性或者方法時,它會先在物件自身中尋找,如果有,則直接使用;
如果沒有,則會去原型物件中尋找,如果找到,則直接使用
使用in檢查物件中是否含有某個屬性時,如果物件中沒有,但原型中有,也會返回truefunction
myclass()
//向myclass的原型物件中新增屬性a
myclass.prototype.a =
123;
//向myclass的原型物件中新增乙個方法
myclass.prototype.
sayhello
=function()
;var mc =
newmyclass()
;console.
log(mc.__proto__ == myclass.prototype)
;//true
使用物件的hasownproperty()方法檢查物件自身中是否含有該屬性,只有物件自身含有才返回true
hasownproperty()方法在原型的原型裡。
object物件的原型沒有原型,如果在object中依然沒有找到,則返回undefined
可以修改tostring方法
function
myclass()
myclass.prototype.name =
"原型中的名字"
;var mc =
newmyclass()
;console.
log(
"name"
in mc)
;//true
console.
log(mc.
hasownproperty
("name"))
;//false
//修改myclass原型的tostring 方法
myclass.prototype.
tostring
=function()
;
js建構函式和原型
建立物件的方式 1,物件字面量 var obj1 2,new object var obj2 new object 3,利用建構函式建立物件 建構函式 利用建構函式 可以建立很多個物件 建構函式,把物件中公共屬性和方法抽出來,放在建構函式裡,通過new建立不同的物件 function star na...
函式原型 函式宣告
對func函式的定義 char func int x,int y 對func函式的呼叫 char s s func 10,50 對func函式的原型說明 char func int x,int y 後面有分號,並且沒有函式體 函式宣告由函式返回型別 函式名和形參列表組成。形參列表必須包括形參型別,但...
js 建構函式和原型鏈
比較new和object.create 建構函式 new 保留原建構函式屬性 object.create 丟失原建構函式屬性 原型鏈new 原建構函式prototype屬性 object.create 原建構函式 物件 本身 作用物件 new function object.create funct...