2016-05-15 68 views
0

自定義創建的對象如何訪問方法,如.toString() 方法是Object方法。如何連接到一個對象的自定義類自定義對象如何從Javascript繼承對象

This文章指出

所有對象最終在它們 原型鏈末端的對象構造。這意味着添加到對象屬性的任何方法或屬性都可以自動用於所有對象。

在前面的示例中,如果我們調用rufus.toString(),則javascript 將檢查rufus對象,然後檢查Cat對象,然後檢查Pet 對象。寵物對象的原型與對象 構造函數創建(使用對象字面快捷方式),這樣的JavaScript將 然後找到toString()方法的對象的原型

現在通過文章看完之後我明白,爲了從一個對象繼承我們必須在對象的函數構造函數的原型中指定我們想要繼承的對象。現在我讀了默認情況下,prototype屬性爲空。那麼對象如何具有toString()屬性?我不明白

寵物對象的原型與對象構造 (使用對象字面快捷方式)創建的聲明

更新:

我讀到的原型屬性構造函數默認爲空。我讀了here我已經貼在這裏

首先報價,每一個JavaScript函數都有一個原型屬性(這 屬性默認爲空),並且當您要附加的屬性,並在此原型屬性方法 實現繼承。

我們如何繼承javascript對象呢?

+0

*現在我讀了默認情況下的原型屬性是空的。*你在哪裏讀過的?請注意,對象的原型與原型屬性(通常與構造函數關聯)不是**相同。 – 2016-05-15 08:21:57

+0

@torazaburo你能解釋一下嗎?你能解釋一個對象的原型和原型屬性之間的區別嗎?我以爲我在混合他們.. –

+0

是的,我也認爲你是。網上有比我在一個段落中更好的解釋。搜索「原型和'__proto__'之間的區別」或類似的東西。 – 2016-05-15 13:21:56

回答

3

所有對象都通過原型繼承繼承Object的屬性。如果你這樣做:

var b = {}; 
console.log(b.__proto__) 

你可以看到從Object繼承的所有屬性。

那麼,什麼情況是,當你做b.toString(),它會尋找toString()功能上b,那麼它會持續上漲原型鏈,最終達到Object具有此功能。

編輯:

功能構造VS對象:

只是爲了澄清,功能構造定義如下:

var a = function() { 
    this.b = "b"; 
    this.c = "c"; 
} 

有其原型設置爲function。這可以通過做console.log(a)來驗證。

但是,我們使用a創建新對象這樣的:

var d = new a(); 

而且這些對象都有自己的原型設置爲Object這又可以通過做console.log(d)驗證。

更多細節here.

+0

我讀到__proto__屬性是對prototype屬性的引用,默認情況下prototype屬性是空的,除非明確指定。那麼自定義對象如何能夠隱式地從'Object'繼承? –

+0

你是從哪裏讀的?有關詳細理解,請參閱https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/prototype –

+0

我更新了我的文章並回答了您的問題 –

0

從JavaScript參考權威指南:

通過對象文本創建的所有對象,即{}具有相同的原型對象,我們可以參考這個原型對象中的JavaScript代碼Object.prototype。使用關鍵字new和構造函數調用創建的對象使用構造函數的prototype屬性的值作爲其原型。因此,new Object()創建的對象繼承自Object.prototype,就像由{}創建的對象一樣。同樣,由new Array()創建的對象使用Array.prototype作爲其原型,而由new Date()創建的對象使用Date.prototype作爲其原型。

所以其使用{}文字將Object.prototype作爲他們的原型,並已獲得通過Object.prototype例如toString()等等等等

new運算符用來創建和初始化新對象定義的方法創建的所有對象。 new關鍵字必須與函數調用一起使用。當函數調用與new關鍵字一起使用時,它被稱爲構造函數調用。

new創建的對象和函數調用將繼承構造函數的prototype屬性。因此用new Date()創建的對象將繼承Date.prototype,而使用new Array()創建的對象將繼承Array.prototype

您可以更改此prototype屬性以使對象從您自己的自定義對象繼承。例如

function myFunction() { 
    this.name = 'a'; 
    this.age = 20; 
} 

myFunction.prototype = { 
    toString: function() { 
     // you can override default toString() method here.. 
    }, 

    // you can define as many functions here as you want. 
}; 

var myObj = new myFunction(); 

對象myObj將從myFunction.prototype繼承和在這個對象中定義的所有方法將提供給myObj

EcmaScript5定義了一個新方法Object.create()用於創建對象的原型不是Object.prototype。例如

var prototypeObject = {a: 1, b: 2, c: 3}; 
var obj1 = Object.create(prototypeObject); 

現在obj1' will inherit from prototypeObject」,而不是從Object.prototype

0

你問

如何自定義創建的對象訪問方法,如 的ToString()方法,它是一種對象方法。如何將一個自定義類 鏈接到一個對象

從閱讀您發佈的內容看,您似乎已經超過了它。你明白了,那你ungot吧。在不包含任何代碼的情況下回答問題。

在編程中,所有對象都從默認對象繼承。把它想象成JavaScripts模板,它必須從某些東西開始,它具有基本屬性和方法,並且基於它構建。每個對象都有不同的基本屬性。 我在之前的文章中說過原型鏈在這裏結束,但這並不完全準確,因爲原型鏈以null結尾。