__proto__ 前面兩杠后面兩杠,這種命名叫隱式命名。一般是系統(tǒng)定義的,盡量不要去修改。
_this 在開發(fā)過程中,這種前面加一個(gè)下劃線的規(guī)則,一般表示私有的,就是別人私有定義的,讓其他人不要隨意動(dòng)。
Preson.prototype.name = 'old_prototypr'
function Preson(){
? ? ? ? //var this : {
? ? ? ? ? ? ? ? //? __proto__ : Preson.prototype? 在new Preson()創(chuàng)建新對(duì)象的時(shí)候,不僅會(huì)隱式執(zhí)行之前說的構(gòu)造函數(shù)產(chǎn)生新對(duì)象的那三步,還會(huì)在this中隱式定義一個(gè)屬性__proto__,這個(gè)屬性的屬性就是指向原型Preson.prototype。當(dāng)對(duì)象本身沒有某個(gè)屬性的時(shí)候,它就會(huì)到這個(gè)屬性所指向的這個(gè)值上面去找。
????????}
}
var obj = {
? ? name:'new_prototype'
}
preson.__proto__ = obj;? //這樣子preson的原型就被修改了,就是說__proto__是可以被修改的,不一定非得指向Preson.prototype。因?yàn)橹挥性趎ew 的時(shí)候產(chǎn)生隱式的那三步。
注意:Object.prototype是所有原型鏈的終端,Object.prototype.__proto__-->null
創(chuàng)建對(duì)象的方法:
1.對(duì)象字面量-->var obj = {}
2.構(gòu)造函數(shù)-->var obj1 = new Object();
3.Object.create()-->var obj2 = Object.create('原型');
/--------------------------------------方法三-------------------------------------/
Preson.prototype.name = "xxx";
function Preson(){}
var ?preson = Object.create(Preson.prototype);
/----------------------------------------------------------------------------/
絕大多數(shù)的對(duì)象最終都會(huì)繼承自O(shè)bject.prototype,但是Object.create(原型),里面的Object.create(null)沒有原型。
undefined和null不能調(diào)用toString方法,因?yàn)樗鼈兙褪窃贾?,它們沒有原型也不是對(duì)象,所以不能進(jìn)行包裝類,但是number和string還有boolean是有原型的,可以進(jìn)行包裝類,在系統(tǒng)運(yùn)行時(shí)會(huì)進(jìn)行包裝類。
123.toString()這里的點(diǎn)會(huì)被識(shí)別成浮點(diǎn)型,點(diǎn)的優(yōu)先級(jí)最高,所以會(huì)被報(bào)錯(cuò),應(yīng)該先聲明變量再將數(shù)字賦值,然后再執(zhí)行toString方法。
var num =123;
num.toString() --> new Number(num).toString();
Number.prototype.toString = function(){}所以num.toString()本質(zhì)上是調(diào)用的原型上面的這個(gè)toString方法
Number.toString.__proto__ = Object.prototype所以按照原型鏈上查找,當(dāng)找到toString方法就會(huì)直接調(diào)用,而不是報(bào)錯(cuò)
如果原型上面本身有某一個(gè)方法,而我們又人為的在對(duì)象本身上面添加了一個(gè)名字一樣但是功能不一樣的方法,這叫做重寫,即覆蓋原型上的方法,其實(shí)就是當(dāng)在原型鏈上面查找的時(shí)候,在自身找到了,就不會(huì)再到原型上去找了,相當(dāng)于截?cái)嗔艘粯印?/p>
對(duì)于浮點(diǎn)數(shù) ?前16位 ? ?后16位計(jì)算是精準(zhǔn)的,但是超過以后,就是前面的計(jì)算不準(zhǔn),后面的會(huì)用科學(xué)計(jì)數(shù)法表示。
function Preson(name , age){
? ? this.age = age;
????this.name = name;
}
var preson = new Preson("hh" , 18)
var obj = {name:'xyz'}
Preson.call(obj , '葉子' , 18);
可以試一下打印obj看顯示的是什么?
/--------------------------------------------call和apply-----------------------------------------------/
call和apply的作用就是改變this指向,但是由此導(dǎo)出一個(gè)功能就是借用別人的函數(shù)改變自己函數(shù)的功能。
function Preson(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
}
function Student(name,age,sex,tel , grade){
//var this = {}
this.tel = tel;
this.grade = grade;
Preson.call(this,name,age,sex);
}
var student = new Student('yx',18,'women','...',99);?
apply的用法同call,但是call需要將實(shí)參按順序傳進(jìn)去,而apply只需要傳一個(gè)arguments,apply只接受兩位參數(shù),第一位都是一樣的。
改變this指向,傳參列表不同。