旅游网站开发实训报告/目前最流行的拓客方法
在传统的JavaScript中,只有对象的概念,并没有类的概念,我们在创建一个对象时,需要先定义一个构造函数,再通过new关键字实例化对象。
function Person (name,age){this.name = name;this.age = age;
}
Person.prototype.print(){return "我的名字叫" + this.name+"今年"+this.age+"岁了";
}
var obj = new Person ('老铁',18);
console.log(obj.print());
在传统语法中,print方法是定义在构造函数外,定义在原型上的方法,容易给人造成困惑。
ES6引入了Class(类)这个概念,通过class关键字可以定义类。该关键字的出现使得其在对象写法上更加清晰,更像是一种面向对象的语言。如果将之前的代码改为ES6的写法就会是这个样子:
class Person {constructor(name,age){this.name = name;this.age = age;}print(){return "我的名字叫" + this.name+"今年"+this.age+"岁了";}
}
var obj=new Person('老铁',18);
console.log(obj.print());
本质上class类就是一个函数,类的本身就指向构造函数,在实例化对象的时候同样也是通过new关键字调用。es6之前,构造函数的原型上的方法是“写在外面”的,es6中,构造函数的原型同样存在,写在class类当中,constructor构造器之外,这样的写法更加一目了然,更加遵循面向对象的思想。
类的所有方法其实最终还是定义在类的原型上,所以我们依旧可以通过prototype新增方法。
Person.prototype.addFn=function(){return "我是通过prototype新增加的方法,名字叫addFn";
}
var obj=new Person("laotie",88);
console.log(obj.addFn());//我是通过prototype新增加的方法,名字叫addFn
Object的原型上有一个方法assign(),可以用于混合对象,所以我们可以通过assign方法将新增方法与原型进行混合,同样可以为类增添新的方法。
Object.assign(Person.prototype,{getName:function(){return this.name;},getAge:function(){return this.age;}
})
var obj=new Person("laotie",18);
console.log(obj.getName());//laotie
console.log(obj.getAge());//18
class不存在变量提升,所以需要先定义再使用。因为ES6不会把类的声明提升到代码头部,但是ES5就不一样,ES5存在变量提升,可以先使用,然后再定义。
//ES5可以先使用再定义,存在变量提升
new A();
function A(){}
//ES6不能先使用再定义,不存在变量提升 会报错
new B();//B is not defined
class B{}