////test
function Person(name){
this.name = name;
}
Person.prototype.name = 'proto' //設置原型對象的name屬性
var person1 = new Person(); //創(chuàng)建實例person1
var person2 = new Person(); //創(chuàng)建實例person2
console.log(Person);// [Function: Person] 方法本身
console.log(Person.prototype.constructor) //[Function: Person] 構造函數(shù)Person原型對象的constructor屬性
console.log(person1.__proto__); //Person { name: 'proto' } 實例person1的[[prototype]]
console.log(Person.prototype); //Person { name: 'proto' } 構造函數(shù)Person原型對象
console.log(Person === Person.prototype.constructor); //true 指向1
console.log(person1.__proto__ === Person.prototype);//true 指向2
console.log(person1.__proto__ === person2.__proto__); //true 無指向
console.log(Object.getPrototypeOf(person1) === Person.prototype) //true 構造函數(shù)Person的原型對象 和 實例person1的[[prototype]] (這個不知道這樣描述正確不)
person1.__proto__.name = 'modify'; //通過實例的[[prototype]] 改變了person1實例[[prototype]]的name屬性
console.log(Person.prototype.name); // modify
console.log(person2.__proto__.name); //modify
var person3 = new Person();
console.log(person3.__proto__.name) //modify
指向1:構造函數(shù)Person原型對象的constructor屬性指向Person 這一個構造函數(shù), 且2者全等。不能得出如果2個屬性全等,則有指向,而書中指向是單向性,為什么?不清楚書中的指針的含義
問題1:
構造函數(shù)Person原型對象的constructor屬性指向Person 這一個構造函數(shù), 且2者全等。不能得出如果2個屬性全等,則有指向,而書中指向是單向性,為什么?
指向2:構造函數(shù)person1的[[prototype]]指向Person構造函數(shù)的原型對象,在書中有寫到 "雖然通過對象實例訪問保存在原型的值,但卻不能通過對象實例重寫原型的值
問題2:
但是在后面輸出3個modify中,很明顯原構造函數(shù)原型的值可以被對象實例person1或者person2修改了,這是為什么??
PS:有沒有什么推薦書可以理解與一下的~~~
Fun.prototype.constructor的地址也是0x0001,并不是說是一個單向的關系。好比,我家在人民路01號,你有一個屬性是我家的位置,你使用這個位置的時候就會被直接導向人民路01號。這應該是書里前面的存值與存址的概念,包括指向2也是這個意思。person2.__proto__存的是Person.prototype對象的地址,改person2.__proto__直接就導向了Person.prototype,所以你改的就是構造函數(shù)的原型,而不是實例本身,所以不符合通過修改實例修改了構造函數(shù)原型這一結論。補充評論里的一些東西:
其中LHS和RHS可參考
前面有點不嚴謹?shù)牡胤剑瑧擃愃朴?/p>
var a = {key: 'a'}
// 內存里一塊區(qū)域0x0001存下了{key: 'a'}
// a -->0x0001
var b = a
// RHS查到a地址為0x0001,拿到該地址并
// b -->0x0001
var c = {key: 'c'}
// 內存里一塊區(qū)域0x0002存下了{key: 'c'}
b = c
// RHS查到c地址為0x0002,拿到該地址并
// b -->0x0002
// 但是a還是指向0x0001
//如果這么改
c.key = 'new'
// 找到c為內存中0x0002,將其中key改為'new'
// 又因為b和c現(xiàn)在都指向0x0002,所以他們就都變了第一個問題沒看懂你說的啥。
第二個問題:
書上所說實例訪問是這樣的:personal2.name,這樣訪問的話由于name是原型繼承來的,所以它不是personal2本身的,如果你personal2.name=modify這樣修改的話,相當于給personal2.name自身添加屬性,不影響原型里的。這也就是原型鏈里的說的,先訪問自己的,自己沒有,再訪原型的。
而personal2.__proto__.name,這樣訪問的話是指接訪問原型對象的,跟Personal.prototype.name效果一樣。而且有的瀏覽器好像不實現(xiàn)此__proto__屬性,都不建議使用。畢竟不希望每個實例都可以修改原型對象。
我看javascript權威指南、javascript高級程序設計等,反正有關的都看看,共同學習。
通過實例的隱式原型__proto__是可以修改構造函數(shù)的原型對象(prototype)上的值,因為__proto__跟構造函數(shù)的原型對象(prototype)全等( __proto__指向 構造函數(shù)的原型對象prototype ),而且__proto__的指向可以被改變
var Createobj = function(){
}
Createobj.prototype.userName = 'ghostwu';
var obj = new Createobj();
console.log( obj.userName ); //ghostwu
obj.__proto__.userName = 'abc';
console.log( obj.userName ); //abc
var obj2 = new Createobj();
console.log( obj2.userName ); //abc北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產業(yè)為響應國家深化產教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復興的升級產業(yè)鏈。利用北京大學優(yōu)質教育資源及背
博為峰,中國職業(yè)人才培訓領域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經理職務負責iOS教學及管理工作。
浪潮集團項目經理。精通Java與.NET 技術, 熟練的跨平臺面向對象開發(fā)經驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經驗。曾經歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構師,美國AngelEngineers Inc. 系統(tǒng)架構師。