一、前言
理解原型和原型链,是js的必走之路
二、构造函数
构造函数:第一用new关键字 第二首字母一般大写
function Person(name, age) {
this.name = name;
this.age = age;
this.sayName = function () {
console.log(this.name);
};
}
三、new 操作执行的四件事
- 创建一个空对象
- 让this指向这个空对象
- 执行构造函数里的代码,给整个新对象添加属性和方法
- 返回这个新对象
四、构造函数的特征
- 构造函数就是一个普通的函数,但是有自己的特征和用法:
1、 为了与普通函数区别,构造函数名字的第一个字母通常大写。
2、 函数体内部使用了this关键字,指向创建的实例对象。
3、 生成对象的时候,必须使用new关键字
五、原型对象
构造函数创建对象时对于基本类型的成员直接存放在对象里 引用类型的成员会开辟一个段内存存放即使是重复共用的方法也会复制多份,每个对象对应复制一份,造成内存浪费。prototype对象就可以解决这个问题
构造函数通过原型对象分配的函数是所有对象共享的。我们可以把那些不变的方法和属性定义在prototype对象上,这样所有的对象实例都可共享
Person.prototype.sayAge = function() {
console.log(this.age);
};
let pi = new Person("KIee GRo",50)
let po = new Person("John Doe", 30);
console.log( pi.sayAge === po.sayAge ); // true
console.log( pi.sayName === po.sayName ); // false
在js中,每个函数都有一个prototype对象,里面有constructor属性指回到构造函数;而每一个对象有都有一个对象原型 __proto__ 属性指向构造函数的原型对象。
console.log(Person.prototype.constructor === Person); // true
console.log(Person.constructor === Function); // true
console.log(Object.constructor === Function); // true
console.log(Function.constructor === Function); // true
console.log(Person.__proto__ === Function.prototype); // true
console.log(Object.__proto__ === Function.prototype); // true
console.log(Function.__proto__ === Function.prototype); // true
六、构造函数,原型对象,对象实例三者关系如下图:
七、原型链
原型对象也是一个对象,同样也具有 __ proto__属性指向它的构造函数的原型对象;这就形成了原型链。最终会指向 Object.prototype。 Object.prototype的 __proto__ 属性指向null。如下图:
八、面向对象和面向过程
面向过程: 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个一次调用就可以了。
面向对象: 它将真实世界各种复杂的事物、关系,抽象为一个个对象,这些对象具有自己的特征(属性)和功能(方法);然后再用一个调度程序去调用对应的方法去实现我们的功能。在面向对象的编程思想里一切皆为对象。