Class与普通构造函数有什么区别

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 !`


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容