JavaScript

函数中的this永远指向它的调用者

JavaScript中的面向对象

在JavaScript中的面向对象的设计思想是

  • 创建构造函数
  • 根据构造函数创建实例对象(通过构造函数new一个对象)
  • 通过构造函数创建的实例对象实现自己的行为(函数)

面向对象的抽象程度比函数要高,因为一个构造函数中既包含数据,又包括操作数据的方法

创建对象

  1. 可以通过nwe Object()的方式来创建:

    1
    2
    3
    4
    5
    6
    var Person = new Object() 
    Person.name = 'jack';
    Person.age = '18';
    Person.sayName = function () {
    console.log(this.name)
    }
  2. 每次通过new Object()的方法来完成比较复杂,所以可以通过它的简写形式字面量来创建

    1
    2
    3
    4
    5
    6
    7
    var Person = {
    name : 'jack',
    age : '18',
    sayName : function () {
    console.log(this.name);
    }
    }

如果想要生成2个Person实例对象可以通过工厂函数来实现函数重复的问题

1
2
3
4
5
6
7
8
9
10
11
12
function createPerson (name,age) {
return {
name : 'name',
age : 'age',
sayName : function () {
console.log(this.name)
}
}
}
//然后调用函数生成实例对象
var p1 = createPerson(jack,18);
var p2 = createPerson(nick,20);

通过工厂函数解决了创建多个对象的冗余问题

构造函数

1
2
3
4
5
6
7
8
9
function Person(name,age) {
this.name = 'name';
this.age = 'age';
this.sayName = function () {
console.log(name);
}
}
var p1 = new Person(jack,18);
var p2 = new Person(nick,20);

构造函数通过this指向实例对象

构造函数跟实例对象的关系,在实例对象都有一个为_ proto _的属性,在 _ proto _属性中有一个constructor属性指向创建该实例的构造函数。

构造函数带来的好处就是创建对象更加方便了,但由于如果创建多个实例对象的时候会出现数据的重复使用,这样会浪费内存,为了解决这个问题,可以把须要共享的函数定义到构造函数外部,在构造函数中直接调用就可以了,但是这样会造成全局变量命名的冲突的问题。

这个问题可以根据原型(prototype)来解决,在每一个构造函数中都有一个prototype属性,指向

什么是原型

​ 在JavaScript中当我们创建一个函数的时候就会在内存中自当的生成一个对象,并且每个函数都有一个prototype属性指向这个自动生成的对象即prototype的值为这个对象。这个对象就是函数的原型对象。在原型对象中有一个属性constructor指向这个函数,即constructor属性的值为创建的函数。

文章目录
  1. 1. JavaScript中的面向对象
  2. 2. 什么是原型
|