__proto__, prototype, constructor

317 阅读1分钟

__proto__

__proto__的作用就是:当访问一个对象的属性时,如果该对象不存在该属性,就向上查找__proto__是否包含该属性,直到__proto__为null,即原型链顶端,还没找到该属性就是undefined。

(注:其实我不是很明白,为啥 {}.__proto__.__proto__是null, 而{}.__proto__.a是undefined。)

    var obj = {};
     // 这四个是一个东西
    Object.prototype;
    obj.__proto__;
    (new Object()).__proto__;
    (new Object()).__proto__.constructor.prototype; 

使用Object.create()创建对象,可为一个对象指定原型

 var a = {
           count: 1
        }
 var b = Object.create(a) 
 b.__proto__ === a  //true

Object.create()和this指针

    const person = {
      isHuman: false,
      printIntroduction: function() {
        console.log(this); //
      }
    };

    const me = Object.create(person); 

    me.name = "Matthew"; 
    me.isHuman = true; 
    const mm = Object.create(me);
    mm.isHH = true;
    mm.printIntroduction(); 
    // printIntroduction中的this就是mm对象

constructor

proto js中所有的对象都有构造函数,因为本来所有的函数都可被用作构造函数new对象。每个对象的原型都是有一个构造函数和一个原型(如果不是原型链顶端),所有

function Func() { } 
var f1 = new Func();
console.log(f1.__proto__);
// f1.__proto__包括属性coustructor和__proto__
// constructor就是构造函数
// __proto__就是{}.__proto__,因为所有对象都继承Object

prototype

只有方法才有prototype属性,对象的构造函数的prototype指向的是创建该对象的原型,所以

function Func() { } 
var f1 = new Func();
f1.__proto__===f1.__proto__.constructor.prototype; // true
/* 所以这也就是为什么Object.prototype==={}.__proto__了,因为
 对象可以用new Object()创建,所以Object就会对象原型的constructor。
 那有new Function()吗?
 */

其他

因为Array的prototype有toString方法,Object的prototype也有toString方法,如果一个数组想调用Object的toString方法,就可以使用

var arr=[1,2,3]
arr.__proto__.__proto__.toString.call(arr);
Array.prototype.__proto__.toString.call(arr);
Object.prototype.toString.call(arr);
{}.toString.call(arr);
//可以为Array原型定义新方法
Array.prototype.toFixed=function(){
  for(let i=0;i<this.length;i++){
    this[i]=this[i].toFixed(2); 
  }
}
// arr =['1.00','2.00','3.00']
arr.toFixed();