Class在语法上更贴合面向对象的写法。
Class实现继承更加易读、易理解。
更易于写java等后端语言的使用。
本质是语法糖,使用prototyp。
一、JS构造函数
JS中的prototype:每一个构造函数都有的一个属性,能够用来向对象添加属性和方法。用来返回对象类型原型的引用。不需要显式声明,它是隐式存在的。
object.prototype.name = value
object.prototype.func = function() {...}
object.prototype =object
1、原型法设计模式:现在有1个类A,我想要创建一个类B,这个类是以A为原型的,并且能进行扩展。我们称B的原型为A。
2、当一个对象被创建时,这个构造函数 将会把它的属性prototype赋给新对象的内部属性__proto__。这个__proto__被这个对象用来查找它的属性。
3、在外部不能通过prototype改变自定义类型的属性或方法,即当原型方法和对象方法在调用相同的属性和函数时,会执行对象方法里面的属性和函数。
二、ES6中的构造语法——Class
三、语法糖
之所以叫做语法糖,不只是因为加糖前后的代码实现的功能一样,更重要的是,糖在不改变其所在位置的语法结构的前提下,实现了运行时的等价。也可以理解为,加糖前后的代码编译结果是一样的。加糖只是为了让代码的更加简洁,语义更加自然。
在class语法中:typeof MathHandle ----->function
MathHandle === MathHandle.prototype.constructor // JS中没有类,class本质上还是构造函数
function定义的方法(对象方法)有一个prototype属性,使用new生成的对象就没有这个prototype属性。也就是prototype属性是对象方法或者构造方法的专有属性。 prototype属性又指向了一个prototype对象,注意prototype属性与prototype对象是两个不同的东西,要注意区别。在prototype对象中又有一个constructor属性,这个constructor属性同样指向一个constructor对象,而这个constructor对象恰恰就是这个function函数本身。
function Person(name)
{
this.name=name;
this.showMe=function()
{
alert(this.name);
}
};
var one=new Person('js');
alert(one.prototype) //undefined
alert(typeof Person.prototype); //object
alert(Person.prototype.constructor); //function Person(name) {...};
四、JS继承
1、拓展原型。可以理解为Dog对象将Animal中的属性和方法全部克隆一遍,Dog能够使用Animal中的方法和属性。
2、如果子类和父类中的方法同名,则运行时会先去本体的函数中去找,如果找到则运行,找不到则去prototype中寻找函数,理解为prototype不会克隆同名函数。
五、ES6中的继承——Class
ES6中的字符串占位符:
JS中:"hello" + str + "world !"
ES6中:`hello ${str} world !`