1. 构造函数, 实例, 原型三者关系如下
构造函数的 prototype 指向其原型对象
原型对象的 constructor 指向其构造函数
使用 new 关键字实例化构造函数
实例化对象的__proto__指向其原始的原型对象.
image
2. 构造函数:
JS 中使用构造函数作为对象的模板, 提供一个生成对象的模板, 并描述对象的基本结构的函数
(eg: 简单讲相当于一个造月饼的模子)
一个构造函数, 可以生成多个对象, 每个对象都有相同的结构.
构造函数默认无返回值
构造函数的 this 就是指的实例对象
3. 实例
new 构造函数就可以创建该构造函数的实例
4. 原型
在 JavaScript 中, 除了 null 所有对象都有一个与之关联的对象, 既原型
每当定义一个对象 (函数也是对象) 时候, 对象中都会包含一些预定义的属性. 其中每个函数对象都有一个 prototype 属性, 这个属性指向函数的原型对象
所有对象实例共享原型对象的属性和方法
5. 原型链
用来实现继承和共享属性的有限对象链
proto 任何对象都有, JS 万物皆对象, 由 proto 链接起来的链条, 一直访问直到出现 null, 这种关系被称为原型链
6.JS 变量 / 属性在原型链上的查找顺序
先找自有 (特权方法)-> 原型 (公有方法)-> 原型再向上的原型 proto -> Object -> undefined
- eg:
- var A = function () {
- this.i = 2;
- }
- A.prototype.i = 3;
- var B = function() {
- this.i = 4;
- }
- B.prototype = new A();
- var b = new B();
- console.log(b.i); //4;
- delete b.i;
- console.log(b.i); // 2;
- delete B.prototype.i;
- console.log(b.i); //3
7. 构造函数与普通函数区别
构造函数:
函数用来初始化 (使用 new 运算符) 一个新建的对象
当以 new 调用构造函数 (执行 var person = new Person()) 时, 函数内部会发生以下情况:
1. 创建空对象
var person = {}
2. 构造函数的 this. 指向 person
Person.call(p)
3.person 继承了构造函数 Person()的原型
person.__proto__ = Person.prototype
4. 执行构造函数 Person()内的代码
普通函数:
不使用 new 运算符的函数
this
构造函数 this 指向构造出来新对象
在普通函数 this 指向的是 Windows 全局对象(不建议使用)
return 返回值
构造函数默认不用 return 返回值; 普通函数一般都有 return 返回值
1. 构造函数会默认返回 this, 也就是新的实例对象
2. 普通函数如果没有 return 值的话, 返回 undefined
3. 如果使用了 return, 那返回值会根据 return 值的类型而有所不同
return 的是五种简单数据类型, 普通函数返回, 构造函数仍返回 this 对象
return 的是引用类型, 构造函数和普通函数都会返回 return 后面的值
写法
构造函数首字母建议大写; 普通函数首字母建议小写
来源: http://www.jianshu.com/p/b163e72aa8ae