class Person 用关键词class就可以定义一个Person的原型对象,该关键字的出现使得其在对象写法上更加清晰,更像是一种面向对象的语言。如果将之前的代码改为ES6的写法就会是这个样子:
class Person{
constructor(name,age){
this.name=name
this.age=age
}
say(){
return "我的名字叫" + this.name+"今年"+this.age+"岁了"
}
}
let a= new Person('czx',18)
console.log(a.say());//我的名字叫czx今年18岁了
注意:1、在类中生命方法的时候,千万不要用function关键词
2、方法之间不要用逗号分隔,否则会报错
所以可以认为ES6中的类其实就是构造函数的另外一种写法!
类中的所有方法都定义在类的prototype属性上,假如在prototype上定义say()方法,则会覆盖类里面定义的say()方法
Person.prototype.say=function(){//定义与类中相同名字的方法。成功实现了覆盖!
return "我是来证明的,你叫" + this.name+"今年"+this.age+"岁了";
}
var a=new Person("czx",35);
console.log(a.say());//我叫czx今年35岁了
constructor方法是类的构造函数的默认方法,如果没有显示定义,则会自动生成一个隐式生成一个constructor方法
实例属性与原型属性
constructor中定义的属性可以称为实例属性(即定义在this对象上),constructor外声明的属性都是定义在原型上的,可以称为原型属性(即定义在class上)。hasOwnProperty()函数用于判断属性是否是实例属性。其结果是一个布尔值, true说明是实例属性,false说明不是实例属性。in操作符会在通过对象能够访问给定属性时返回true,无论该属性存在于实例中还是原型中。
class Box{
constructor(num1,num2){
this.num1 = num1;
this.num2=num2;
}
sum(){
return num1+num2;
}
}
var box=new Box(12,88);
console.log(box.hasOwnProperty("num1"));//true
console.log(box.hasOwnProperty("num2"));//true
console.log(box.hasOwnProperty("sum"));//false
console.log("num1" in box);//true
console.log("num2" in box);//true
console.log("sum" in box);//true
console.log("say" in box);//false
constructor中定义的属性可以称为实例属性(即定义在this对象上),constructor外声明的属性都是定义在原型上的,可以称为原型属性(即定义在class上)。hasOwnProperty()函数用于判断属性是否是实例属性。其结果是一个布尔值, true说明是实例属性,false说明不是实例属性。in操作符会在通过对象能够访问给定属性时返回true,无论该属性存在于实例中还是原型中。