关于原型链
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)中的对象

浙公网安备 33010602011771号