class Person{
constructor(){
this.name = new String('Jack');
this.sayName = () => console.log(this.name);
this.nicknames = ['Jake','J-Dog']
}
}
let p1 = new Person(),
p2 = new Person();
p1.sayName();
p2.sayName();
console.log(p1.name === p2.name);//false
console.log(p1.sayName === p2.sayName);//false
console.log(p1.nicknames === p2.nicknames);//false
p1.name = p1.nicknames[0];
p2.name = p2.nicknames[1];
p1.sayName();//Jack
p2.sayName();//J-Dog
在构造函数内部,可以为新创建的实例添加“自有属性”。
构造函数执行完毕后,仍然可以给实例继续添加新成员。
每个实例都对应一个唯一的成员对象,这意味着所有成员都不会在原型上共享。
2.原型方法与访问器
class Person{
constructor(){
this.locate = () => console.log('instance');
}
locate(){
console.log('prototype');
}
}
let p = new Person();
p.locate();//instance
p.prototype.locate();//prototype
添加到this中的内容会存在于不同的实例上。
在类中定义的所有内容都会定义在类的原型上。
class Person{
name:"Jake"
}//Uncaught SyntaxError:Unexpected token
可以把方法定义在类构造函数中或则类块中,但不能在类块中给原型添加原始值或对象作为成员数据。
const symbolKey = Symbol('symbolKey');
class Person{
stringKey(){
console.log('invoked stringKey');
}
[symbolKey](){
console.log('invoked symbolKey');
}
['computed'+'Key'](){
console.log('invoked computedKey');
}
}
let p = new Person();
p.stringKey();//invoked stringKey
p[symbolKey]();//invoked symbolKey
p.computedKey();//invoked computedKey
类方法等同于对象属性,因此可以使用字符串、符号或计算的值作为键。
class Person{
set name(newName){
this.name_ = newName;
}
get name(){
return this.name_;
}
}
let p = new Person();
p.name = 'Jake';
console.log(p.name);//Jake
类定义也支持获取和设置访问器,语法与行为跟普通对象一样。
3.静态类方法
class Person{
constructor(){
this.locate = () => console.log('instance',this);
}
locate(){
console.log('prototype',this);
}
static locate(){
console.log("class",this);
}
}
let p = new Person();
p.locate();//instance Person {locate: ƒ}
Person.prototype.locate();//prototype {constructor: ƒ, locate: ƒ}
Person.locate();//class class Person{……}
class Person{
sayName(){
console.log(`${Person.greeting} ${this.name}`)
}
}
Person.greeting = "My name is ";//在类上定义数据成员
Person.prototype.name = "Jake";//在原型上定义数据成员
let p = new Person();
p.sayName();//My name is Jake