一张图让你彻底理解js原型链

function Person() {
    this.name = 'sanlyshi';
    this.age = '23';
    this.eat = function () {
        console.log(this.name +' is eating!')
    }
}
Person.prototype.smell = function () {
    console.log("smell");
};
var person1 = new Person();
console.log(person1.name);   //sanlyshi
person1.eat();               //sanlyshi is eating!
person1.smell();             //smell


// 每个"函数"都有一个prototype属性,指向一个"对象"
// "对象"具有属性__proto__,可称为隐式原型,一个对象的隐式原型指向构造该对象的构造函数的原型

Function.prototype.__proto__.__proto__ === null

Object.prototype.__proto__ === null

Object.prototype === Object.__proto__.__proto__

Object.prototype === Function.prototype.__ptoto__

Object.__proto__ === Function.prototype

Person.__proto__ === Function.prototype

person1.__proto__ === Person.prototype



// "prototype对象"有一个constructor属性,默认指向prototype对象所在的构造函数
console.log(Person.prototype.constructor === Person);   //true
console.log(Function.prototype.constructor === Function);   //true
console.log(Object.prototype.constructor === Object);   //true

呃呃,后面又整理了一下,搞了两张出来,哈哈



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

构造函数方法很好用,但是存在一个浪费内存

通过原型法分配的函数是所有对象共享的.

通过原型法分配的属性是独立.-----如果你不修改属性,他们是共享

如果我们希望所有的对象使用同一一个函数,最好使用原型法添加函数,这样比较节省内存.

例子:

//----构造函数模式

为Cat对象添加一个不变的属性"type"(种类),再添加一个方法eat(吃老鼠)。那么,原型对象Cat就变成了下面这样:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

那就是对于每一个实例对象,type属性和eat()方法都是一模一样的内容,每一次生成一个实例,都必须为重复的内容,多占用一些内存。这样既不环保,也缺乏效率。

//----Prototype模式

Javascript规定,每一个构造函数都有一个prototype属性,指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承。

这意味着,我们可以把那些不变的属性和方法,直接定义在prototype对象上。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

这时所有实例的type属性和eat()方法,其实都是一个内存地址,指向prototype对象,因此就提高了运行效率。

class Student {
    constructor(name) {
        this.name = name;
        //代码体1.这里面的实例的话会给每个实例对象来一份内存存储(构造函数继承)
        //常用来存储基本数据
    }

    hello() {
        alert('Hello, ' + this.name + '!');
        //代码体2.这里的实例的话会,每个实例会公用相同的。prototype的内存(原型继承)
        //这里常用来存储基本方法
    }  
}


//代码体1类比代码:
function Student(name) {
    this.name = name;
}

//代码体2类比代码:
Student.prototype.hello = function () {
    alert('Hello, ' + this.name + '!');
}

 

你可能感兴趣的:(javascript)