先看js里面的new
这篇文章描述了js里面的new的作用
https://zhuanlan.zhihu.com/p/23987456
new之后会产生Foo对应的模板对象(Foo.prototype),再用模板对象(Foo.prototype)对象复制得到新的对象(b,c),然后调用模板对象(Foo.prototype)的constructor(即函数Foo)对新的对象进行修改
原型语言创建有两个步骤
使用”原型对象”作为”模板”生成新对象 :这个步骤是必要的,这是每个对象出生的唯一方式。以原型为模板创建对象,这也是”原型”(prototype)的原意。
初始化内部属性 :这一步骤不是必要的。通俗点说,就是,对”复制品”不满意,我们可以”再加工”,使之获得不同于”模板”的”个性”。
要清楚原型链,首先要弄清楚对象
普通对象:(eg a b)
最普通的对象:有__proto__属性(指向其原型链),没有prototype属性。
原型对象(Person.prototype 原型对象还有constructor属性(指向构造函数对象))
函数对象:(eg Foo())
凡是通过new Function()创建的都是函数对象。
拥有__proto__、prototype属性(指向原型对象)。
原型对象
每创建一个函数都会有一个prototype属性,这个属性是一个指针,指向一个对象(通过该构造函数创建实例对象的原型对象)。原型对象是包含特定类型的所有实例共享的属性和方法。原型对象的好处是,可以让所有实例对象共享它所包含的属性和方法。
原型对象属于普通对象。Function.prototype是个例外,它是原型对象,却又是函数对象,作为一个函数对象,它又没有prototype属性。
通过原型链实现继承
扫描二维码关注公众号,回复:
8803496 查看本文章
//old
function User(name,pass){
this.name = name;
this.pass = pass;
}
User.prototype.showName = function(){
alert(this.name)
}
//old 继承
function VIPUser(name,pass,level){
User.call(this,name,pass);
this.level = level;
}
VIPUser.prototype = new User();
//修正一下构造函数
VIPUser.prototype.constuctor = VIPUser;
//这样的话,先复制了User模板,然后利用VIPUer()进行修改,实现对象的实例化
VIPUser.prototype.shoewLevel = function(){
alert(this.level)
}
//new
class User2{
constructor(name,pass){
this.name = name;
this.pass = pass;
}
showName(){
alert(this.name)
}
}
class VIPUser2 extends User2{
constructor(name,pass,level){
super(name,pass)
this.level = level
}
shoewLevel(){
alert(this.level)
}
}