关于原型链

1.

创建对象的几种方式

let p1={name:'p1'}//字面量创建

let p2= new Object(p1)

//构造函数创建

let M=function(name){this.name=name}

let p3=new M('p3')

//create创建

let p={name:'p4'}

let p4=Object.create(p)

Object.create()方法是ECMAScript5中新增的,用来规范化原型式继承的。
这个方法接收两个参数,一个是用作新对象原型的对象,和一个为新对象定义额外属性的(可选)对象。

let p5=Object.create(p3,{

  testName:{

  value:'新对象自己的属性',

 writable:true,
  configurable:true

  },

 bar: {
    configurable: false,
    get: function() { return 10 },
    set: function(value) {
      console.log("Setting `o.bar` to", value);
    }
  }

})

2.

 

__proto__隐式原型的作用:构成原型链指向的是一个原型对象 ,prototype显式原型的作用:用来实现基于原型的继承与属性的共享,使实例能够访问到原型链上的属性和方法

函数默认有一个公有的、不可枚举的prototype属性、构造函数就在这个属性上。Parent.prototype.constructor === Parent 指向自身

只有函数有prototype属性,所有的对象都有__proto__属性,js中一切皆对象

实例对象的__proto__属性指向的是该构造函数的prototype属性.ps:p.__proto__ === Parent.prototype(也就是构造函数的prototype属性)

ps:

一般函数的__proto__属性===Function.prototype (函数也是对象)

var a =10;即a.__proto__ === Number.prototype

 

3.new 关键字做的事情:

(1) 创建一个新对象;
(2) 将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象) ;
(3) 执行构造函数中的代码(为这个新对象添加属性) ;
(4) 返回新对象.如果new 返回了一个新对象,则替换掉(1)中创建的新对象,否则直接是(1)中的对象

 

posted @ 2018-05-24 15:08  luosisi0202  阅读(153)  评论(0)    收藏  举报