2016-05-09 78 views
6

的區別是什麼__proto__prototype設置值__proto__`和'在javascript原型

之間我讀書最多的文章在網上和我仍然無法理解它.. 據我瞭解 __proto__是原型對象 prototype的屬性是實際對象 我是否正確? ...

爲什麼只有函數具有prototype屬性? 它是如何成爲一個對象?

var fn = function(){}; 
console.dir(fn); 



輸出

function fn() 
    arguments: null 
    caller: null 
    length: 0 
    name: "" 
    prototype: Object 
    __proto__:() 
    <function scope> 

使用對象和功能我試圖爲__proto__
和原型在鉻控制檯中設置的值如下所示

//create object and display it 
var o = {name : 'ss'}; 
console.dir(o); 



輸出

Object 
     name: "ss", 
     __proto__: Object 

//set the values 
o.__proto__ = 'aaa'; 
o.prototype = 'bbb'; 

//after set the values display the object 
console.dir(o); 



輸出

Object 
     name: "ss", 
     prototype: "aaa", 
     __proto__: Object 

//create function and display it 
var fn = function(){}; 
console.dir(fn); 


輸出

function fn() 
    arguments: null 
    caller: null 
    length: 0 
    name: "" 
    prototype: Object 
    __proto__:() 
    <function scope> 



//set the values 
fn.prototype = 'fff'; 
fn.__proto__ = 'eee'; 

//after set the values display the object 
console.dir(fn); 

輸出

function fn() 
    arguments: null 
    caller: null 
    length: 0 
    name: "" 
    prototype: "fff" 
    __proto__: function() 
    <function scope> 


然後我意識到,我不能爲__proto__設定值,但可以設定值prototype。 W爲什麼我不能爲__proto__設置數值?

+0

函數的'.prototype'屬性不會影響本身的功能,它是指對象將成爲原型由調用帶有'new'該函數實例化對象。一個對象的'.__ proto__'屬性引用該對象的實際原型。也就是'Fn.prototype ===(new Fn()).__ proto__'。 – nnnnnn

回答

2

這其實很簡單。

  1. {object}.__proto__是對{constructor function}.prototype對象的引用。
  2. 操作new {constructor function} (params)在JavaScript中做了三件重要的事情:
    1. 創建新的對象,讓它成爲 'OBJ'。
    2. 呼叫{constructor function}this設置爲該新生兒對象(OBJ)。
    3. obj.__proto__ = {constructor function}.prototype;

而這幾乎是它。

obj.__proto__建立單鏈表用於查找未在對象本身中定義的屬性。因爲它被設置爲{constructor function}.prototype對象,那麼我們可以將該原型視爲對象方法的「機架」 - 與對象實例關聯的函數。

例子:

function Foo() {} 
Foo.prototype.bar = function() { return "foo.bar here"; } 

var obj = new Foo(); // creating object with __proto__ set to Foo.prototype; 

obj.bar(); // will return "foo.bar here" 
2

在大多數語言中,都有類和對象。類從其他類繼承。

在JavaScript中,

繼承是基於原型的。這意味着沒有類。取而代之的是,一個對象從另一個對象

繼承繼承,所述__proto__

當對象兔從另一個對象繼承動物,在JavaScript這意味着有一個特殊的屬性rabbit.__proto__ = animal

enter image description here

當兔子屬性進行訪問,並在兔子的解釋無法找到它,它遵循動物__proto__鏈接和搜索。

var animal = { eats: true } 
var rabbit = { jumps: true } 
rabbit.__proto__ = animal // inherit 
alert(rabbit.eats) // true 

原型

一個新的函數調用將對象設置它的原型屬性的值的__proto__

var animal = { eats: true } 
function Rabbit(name) { 
    this.name = name 
} 
Rabbit.prototype = animal 
var rabbit = new Rabbit('John') 
alert(rabbit.eats) 

Complete Reference.