javascript的类与继续

javascript的类与继续

javascript的类与平常的面向对象言语有很大的差别,类的标识是它的组织函数,下面先定义一个类

var User=function(name){
    this.name=name;
};
User.getName=function(){return this.name;};
User.prototype.get_name=function(){return this.name};
user1=new User('kkk');
user2=new User('jjj');
user1.getName=function(){console.log('hello');};
user1.get_name=function(){console.log('hello');};

明显我们能够看出这两个函数是差别的,虽然它们完成了雷同的功用。
接下来我们先诠释组织函数,当我们运用new操作符天生对象时,对象在进入函数之前就已存在了,组织函数所完成的仅仅是初始化的事情。

每一个javascript的函数都生而具有prototype这一属性,它们的new 与prototype.constructor有关。有以下关联存在:

User.prototype.constructor===User
true

同时类的静态要领如getName并非一种值得引荐的要领,由于关于每一个被建立的对象都邑建立响应的函数对象,要领在这里与其他的属性并没有任何不一致的地方。

经由过程工场要领建立类

var User=function(name){
    var user;
    user.name=name;
    user.getName=function(name){return user.name;};
    return user;
}();

经由过程工场要领能够直接建立继续了原型要领的对象,然则如许获得的问题在于没有prototype属性,须要手动增加,不引荐这类要领。

下面最先讲继续的要领,先给出一种示例

function Vip(name,level){
    this.name=name;
    this.level=level;
}
Vip.prototype=User;
alert(Vip.prototype.construtor===Vip);//false

如许明显不可,对子类的任何要领的转变都邑致使父类的要领转变,更严峻的是继续链遭到损坏。

应用组织函数来继续

function Vip(name,level){
    User.call(this,name);
    this.level=level
}
User.prototype.hehe=function(){console.log('hehe');};
(new Vip('kf',2)).hehe();//error!

上面的要领子类明显没法继续父类的原型函数,如许不符合我们运用继续的目标。

function Vip(name,level){
    this.name=name;
    this.level=level;
}
Vip.prototype=new User();
Vip.prototype.constructor=Vip;

这是一种折中的继续体式格局,本质上把子类的一切对象绑定到父类的一个对象上,子类原型要领就是这个对象的一个属性。

    原文作者:suemi
    原文地址: https://segmentfault.com/a/1190000002405756
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞