//所有的物件都是通過new建立出來的
//所有的函式也是物件,所以函式中也可以有屬性,
// 比如array.isarray,number.isnan()
//所有物件都是引用型別
function
test()
}console.log(new
test())//建構函式是object
function
test1()
console.log(new
test1())//建構函式是test1
console.log(typeof
array)//function
console.log(typeof
string)//function
console.log(typeof
function)//function
console.log(typeof
number)//function
console.log(typeof
object)//function
console.log(typeof
boolean)//function
console.log(typeof
null)//object
console.log(typeof
test1)//function
//原型:所有函式都有乙個屬性:prototype,稱之為函式原型
// 預設情況下,prototype是乙個普通object物件,new 乙個物件之後系統預設加上的
//預設情況下,prototype中有乙個屬性,constructor,他也是乙個物件,指向建構函式本身
//隱式原型__proto__,所有物件都有隱式原型,
//隱式原型指向該物件的建構函式的prototype
// 特殊點
// 1.function的隱式原型指向自身的prototype,即function.prototype===function.__proto__
// 2.object的prototype的__proto__指向null
varobj=new
test1();
console.log(obj.__proto__==test1.prototype)//test1返回的是函式,true
varobj1=new
test();
console.log(obj1.__proto__==test.prototype)//test1返回的是乙個物件,false
console.log(obj1.__proto__==object.prototype)//test1返回的是乙個物件,true
// 面試題
function
a() {}
vara=new
a();
varb=new
a();
a.abc=123;
b.__proto__.bcd=456;
console.log(a.abc,b.abc)//123 undefined
console.log(a.__proto__.bcd,b.__proto__.bcd) // 456 456
//改乙個物件的__proto__等同於修改該物件的建構函式的prototype,使用的是同一塊位址空間
console.log(a.prototype.bcd)//456
//當訪問的是乙個物件的成員時,
// 1.如果有,則直接使用
// 2.如果該物件上面沒有,就去隱式原型上面找(__proto__)
//3.如果還是沒找到,就去原型鏈上一直找
//原型鏈上程式設計(猴子補丁):在函式原型中加入成員,以增強物件的功能,但是會導致原型鏈汙染,使用需謹慎
string.prototype.camel=function () ).replace(/\s/
g,"")
}//面試題
varf=function () {}
object.prototype.a=function () {}
function.prototype.b=function () {}
varf=new
f();
console.log(f.a,f.b,f.a,f.b)//fn undefined fn fn
//面試題
function
a() {}
function
b(a)
function
c(a)
}a.prototype.a=1
b.prototype.a=1
c.prototype.a=1
console.log(new
a().a)//1
console.log(new
b().a)//undefined
console.log(new
c().a)//2
//原型鏈最難面試
function
user() {}
user.prototype.sayhello=function () {}
varu1=new
user();
varu2=new
user()
console.log(u1.sayhello===u2.sayhello)//true
console.log(user.prototype.constructor)//user
console.log(user.prototype===function.prototype)//false
console.log(user.__proto__===function.prototype)//true
console.log(user.__proto__===function.__proto__)//true
console.log(u1.__proto__===u2.__proto__)//true
console.log(u1.__proto__===user.__proto__)//false
console.log(function.__proto__===object.__proto__)//true
console.log(function.prototype.__proto__===object.prototype.__proto__)//false
console.log(function.prototype.__proto__==object.prototype)//true
(完)
原型與原型鏈深度學習
1.函式物件的 prototype 屬性 我們建立的每乙個函式都有乙個 prototype 屬性,這個屬性是乙個指標,指向乙個物件。該函式例項化的所有物件的 proto 的屬性指向這個物件,它是該函式所有例項化物件的原型。建構函式 2.constructor屬性 當函式建立,prototype 屬性...
原型鏈學習總結
學習於 定義物件a 和b a.proto b。1 當a.ss時在自身物件找不到該屬性則會往繼承的原型上去找,也就是輸出b.ss。a 和b a.proto b console.log a.ss 2 2 修改原型上的值,即b.ss 3 則a.ss也等於3。a 和b a.proto b b.ss 3 co...
原型 原型鏈
var animal function var dog function animal.price 2000 dog.prototype animal var tidy new dog console.log dog.price 為什麼輸出 undefined console.log tidy.pr...