【问题标题】:setting values to __proto__` and `prototype in javascript [duplicate]在javascript中将值设置为__proto__`和`prototype [重复]
【发布时间】:2016-09-03 14:46:54
【问题描述】:

__proto__prototype有什么区别

我阅读了网络上的大部分文章,但我仍然无法理解它.. 据我所理解 __proto__ 是原型对象的属性 prototype 是实际对象 我对么? ....

为什么只有函数有原型属性? 它又是如何成为对象的呢?

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



输出

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

使用对象和函数我尝试为__proto__设置值
和原型在 chrome 控制台中如下所示

//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 。为什么我不能为__proto__ 设置值???

【问题讨论】:

  • 函数的.prototype 属性不会影响函数本身,它指的是将成为通过new 调用该函数来实例化的对象的原型的对象。对象的.__proto__ 属性指的是该对象的实际原型。即Fn.prototype === (new Fn()).__proto__

标签: javascript oop


【解决方案1】:

在大多数语言中,都有类和对象。类继承自其他类。

在 JavaScript 中,

继承是基于原型的。这意味着没有课程。相反,一个对象继承自另一个对象。

继承,__proto__

当一个对象rabbit继承自另一个对象animal时,在JavaScript中这意味着有一个特殊的属性集rabbit.__proto__ = animal

当访问rabbit 的属性时,解释器在rabbit 中找不到它,它会跟随__proto__ 链接并在animal 中搜索。

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

prototype 属性

在调用构造函数时,new 运算符会隐式地将新创建对象的__proto__ 属性设置为构造函数的prototype 属性的值。

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

Complete Reference.

【讨论】:

    【解决方案2】:

    其实很简单。

    1. {object}.__proto__ 是对 {constructor function}.prototype 对象的引用。
    2. JavaScript 中的
    3. 运算符new {constructor function} (params) 做了三件主要的事情:
      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"
    

    【讨论】:

      猜你喜欢
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多