js裡的物件基本理解(原型)

Jc Bound發表於2019-03-31

1.全域性物件

global物件=window物件, window物件的所有屬性可以在MDN上檢視

ECMAscript規定的一些常用屬性:

parseInt.
parseFloat.
Number().
String().
Boolean().
Object()

瀏覽器一些私有屬性:

alert()(彈窗提示)
prompt()(使用者填寫)
confirm()(確認)
console(開發者)
document(文件)DOM(w3c制定)

2.簡單型別和物件的區別:

2.1 基本型別是存放在在棧區的
var name = "lining";
var gender = "男"
var arr = 12;

js裡的物件基本理解(原型)
物件是放在堆區的: var person1 = {name:"lining"};
var person2 = {name:"xiaoming"};
var person3 = {name:"wanghai"}

js裡的物件基本理解(原型)

2.2賦值方式不同

簡單型別: 在從一個變數向另一個變數賦值基本型別時,會在該變數上建立一個新值,然後再把該值複製到為新變數分配的位置上

var a = 10;
var b = a;

a ++ ;
console.log(a); // 11
console.log(b); // 10
修改a的值,不會對b造成影響,b的值沒變,該值只是a中的值的一個副本,此後, 這兩個變數可以參加任何操作而相互不受影響

js裡的物件基本理解(原型)
物件:

var person = {name:'lining'};
var person2 = person;
person2.age = "12";
console.log(person)
當從一個變數向另一個變數複製引用型別的值時,同樣也會將儲存在變數物件中的值複製一份放到 為新變數分配的空間中。不同的是,這個值的副本實際上是一個指標,而這個指標指向儲存在堆中的一 個物件。複製操作結束後,兩個變數實際上將引用同一個物件。因此,改變其中一個變數,就會影響另 一個變數.

js裡的物件基本理解(原型)

3.公用屬性(protetype:原型)

所有物件都有 toString 和 valueOf 屬性,那麼我們是否有必要給每個物件一個 toString 和 valueOf 呢?

明顯不需要。

var person = new Person();
person.sayName(); //"lining"
複製程式碼

JS 的做法是把 toString 和 valueOf 放在一個物件裡(暫且叫做公用屬性組成的物件)

然後讓每一個物件的__proto__ 儲存這個「公用屬性組成的物件」的地址。_proto_屬性由瀏覽器支援。

我們建立的每個函式都有一個 prototype (原型)屬性,這個屬性是一個指標,指向一個物件, 而這個物件的用途是包含可以由特定型別的所有例項共享的屬性和方法。如果按照字面意思來理解,那 麼 prototype 就是通過呼叫建構函式而建立的那個物件例項的原型物件。使用原型物件的好處是可以 讓所有物件例項共享它所包含的屬性和方法。換句話說,不必在建構函式中定義物件例項的資訊,而是 可以將這些資訊直接新增到原型物件中。

無論什麼時候,只要建立了一個新函式,就會根據一組特定的規則為該函式建立一個 prototype 屬性,這個屬性指向函式的原型物件。在預設情況下,所有原型物件都會自動獲得一個 constructor (建構函式)屬性,這個屬性包含一個指向 prototype 屬性所在函式的指標。就拿前面的例子來說, Person.prototype. constructor 指向 Person 。而通過這個建構函式,我們還可繼續為原型物件 新增其他屬性和方法。

4.重要公式

注意大小寫,number 和 Number 是不同的

var 物件 = new 函式() 物件.proto === 物件的建構函式.prototype

// 推論 var number = new Number() number.proto = Number.prototype

var object = new Object() object.proto = Object.prototype

var function = new Function() function.proto = Function.prototype

// 另外,所有函式都是由 Function 構造出來的,所以 Number.proto = Function.prototype // 因為 Number 是函式,是 Function 的例項 Object.proto = Function.prototype // 因為 Object 是函式,是 Function 的例項 Function.proto == Function.prototye // 因為 Function 是函式,是 Function 的例項!

未完待續……

相關文章