JavaScript中的实例属性、静态属性与原型属性,实例方法、静态方法与原型方法

2,322 阅读2分钟
  1. 实例属性,静态属性与原型属性

    实例属性定义在实例上,可以在构造函数的内部的this上进行定义,也可以在构造函数实例化以后的实例上进行定义。

    静态属性,定义在构造函数之上的属性。可通过构造函数直接访问。

    原型属性,定义在构造函数原型对象之上的属性。

    function Person(name){
        // 在构造函数内部的this上进行定义实例属性
        this.name = name;
    }
    // 在构造函数上定义静态属性
    Person.sex = 'male';
    // 在构造函数的原型对象上定义原型属性
    Person.prototype.weight = 20
    let person = new Person('wang');
    // 在构造函数实例化以后的对象上进行定义实例属性
    person.age = 23;
    ​
    // 访问实例属性name
    console.log(person.name) // wang
    // 访问实例属性age
    console.log(person.age) // 23
    // 访问静态属性sex
    console.log(Person.sex) // male
    // 访问原型属性weight
    console.log(person.weight) // 20
    // 通过构造函数访问原型属性weight
    console.log(Person.prototype.weight); // 20
    
  2. 实例方法,静态方法与原型方法

    实例方法定义在实例上,可以在构造函数内部的this上进行定义,也可以在构造函数实例化以后的实例上进行定义。

    静态属性,定义在构造函数之上的属性。可通过构造函数直接访问。

    原型属性,定义在构造函数原型对象之上的属性。

    function Person(name) {
        this.name = name;
        // 在构造函数内部的this上进行定义实例属性
        this.sayIn = function() {
            console.log('my name is ', this.name);
        }
    }
    // 在构造函数上定义静态方法
    Person.eat = function(){console.log('i can eat anything')};
    // 在构造函数的原型对象上定义原型方法
    Person.prototype.run =  function(){console.log('i can run 100m in 9.88s')}
    let person = new Person('li');
    // 在构造函数生成的实例上定义实例方法
    person.sayOut = function(){
        console.log('my name is out ', this.name);
    }
    ​
    // 访问实例方法sayIn
    person.sayIn();  // my name is li
    // 访问实例方法sayOut
    person.sayOut(); // my name is li
    // 访问静态方法eat
    Person.eat(); // i can eat anything
    // 访问原型方法run
    person.run(); // i can run 100m in 9.88s
    // 通过构造函数访问原型方法
    Person.prototype.run() // i can run 100m in 9.88s
    
  3. ES5与ES6中,静态方法,静态属性声明的区别?

    class Person{
        constructor(sex) {
            this.sex = sex;
        }
        // 使用static关键字声明静态方法
        static printSex(){
            console.log('this is printSexMethod');
        }
    }
    // 静态属性只能通过 类.属性名 来声明
    Person.age = 20;
    // 通过 类.方法名 来声明静态方法
    Person.printSexOut = () => {
        console.log('this is printSexMethodOut')
    }
    console.log('age', Person.age); // 20
    Person.printSex(); // this is printSexMethod
    Person.printSexOut(); // this is printSexMethodOut