类&对象

ES6之前定义类的方法

function Person(myName,myAge){
//实例属性
this.name="zxw";
this.age=24;
}
//实例方法
this.say=function(){
console.log(this.name,this.age);
}
//静态属性
Person.num=666;
//静态方法
Person.run=function(){
console.log("run");
}

从ES6开始系统提供了一个class的关键字,专门用于定义类

class Person{
//当我们通过new创建对象的时候,系统会自动调用constructor
//constructor我们称呼为构造函数
constructor(myName,myAge){
this.name = myName;
this.age = myAge;
}
//实例属性
name="zxw";
age=24;
//实例方法
say(){
console.log(this.name,this.age);
}
//静态属性,ES6 static 只支持定义静态方方不支持定义静态变量
static num = 666;
//静态方法
static run(){
console.log("run");
}
}

继承

ES6之前继承
在子类通过call/apply方法借助父类的构造函数
将子类的原型对象设置为父类的实例对象
ES6开始继承
在子类后面添加estends并制定父类的名称
在子类的constructor构造函数中通过super方法借助父类的构造函数

class Person {
constructor(myName,myAge){
this.name=myName;
this.age=myAge;
}
say(){
console.log("hi");
}
}
//以下代码的含义告诉浏览器将来Student这个类需要继承于Person这个类
class Student extends Person{
  constructor(myName,myAge,myScore){
  super(myName,myAge); this.score=myScore;
}
study(){
console.log("day day up");
}
}
let stu= new Student("zs",24,100);

对象名.constructor.name 获取对象真实的类型,获取创建构造函数的真实名称

instanceof关键字

用判断对象是否是指定构造函数的实例
注意点:只要构造函数的原型对象出现在实例对象的原型链中都会返回true

class Person{
name="zxw";
}
let p = new Person();
console.log(p instanceof Person);//true

isprototypeOf属性

用于判断一个对象是够是另一个对象的原型
注意点:只要调用者在传入对象的原型链上都会返回true

class Person{
name="zxw";
}
let p = new Person();
console.log(Person.prototype.isPrototypeOf(p) );//true

需求判断某个对象是否拥有某一个属性

class Person{
name=null;
age=0;
}
Person.prototype.height=0;
let p =new Person();
in 的特点:只要类中或者原型对象中有,就会返回true
console.log("name" in p);//true
console.log("height" in p);//true

需求判断某个对象自身是否拥有某一个属性

class Person{
name=null;
age=0;
}
Person.prototype.height=0;
let p =new Person();
console.log(p.hasOwnProperyt("name"));//true
console.log(p.hasOwnProperyt("height"));//false

你可能感兴趣的:(类&对象)