在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML/ 關于js高程3上原型的問題

關于js高程3上原型的問題

圖片描述

code圖片描述/code

////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:有沒有什么推薦書可以理解與一下的~~~

回答
編輯回答
拽很帥
  1. 圖中的指向只是實際所在的位置。假如函數(shù)Fun被存在內存中0x0001位置,那么Fun.prototype.constructor的地址也是0x0001,并不是說是一個單向的關系。好比,我家在人民路01號,你有一個屬性是我家的位置,你使用這個位置的時候就會被直接導向人民路01號。這應該是書里前面的存值與存址的概念,包括指向2也是這個意思。
  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,所以他們就都變了
2018年4月6日 09:21
編輯回答
溫衫

nice question! 既然已經了解到這兒了,不妨再看一本書《你不知道的javascript》。小紅書更多得是讓人學會怎么用js,你不知道的js就是在揭js的老底了。你問的問題我覺得都是小紅書想回避的問題。__proto__雖然沒被列為標準,但現(xiàn)代瀏覽器基本都實現(xiàn)了他的功能,所以我覺得你提出的問題是書里有所隱瞞。實際項目里雖然不會去用這個屬性,但不代表我們不需要知道這些東西。

2017年3月12日 12:54
編輯回答
還吻

不嫌棄的話,可以看看我之前寫的這篇總結。點擊跳轉

2018年4月1日 22:57
編輯回答
命多硬

第一個問題沒看懂你說的啥。
第二個問題:
書上所說實例訪問是這樣的:personal2.name,這樣訪問的話由于name是原型繼承來的,所以它不是personal2本身的,如果你personal2.name=modify這樣修改的話,相當于給personal2.name自身添加屬性,不影響原型里的。這也就是原型鏈里的說的,先訪問自己的,自己沒有,再訪原型的。
而personal2.__proto__.name,這樣訪問的話是指接訪問原型對象的,跟Personal.prototype.name效果一樣。而且有的瀏覽器好像不實現(xiàn)此__proto__屬性,都不建議使用。畢竟不希望每個實例都可以修改原型對象。

我看javascript權威指南、javascript高級程序設計等,反正有關的都看看,共同學習。

2018年5月8日 11:32
編輯回答
近義詞

通過實例的隱式原型__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
2017年7月31日 10:43