new 一个对象的过程会发生什么
- 创建一个新对象‘
- 将构造函数的作用域赋值给新作用域,(将this执行该对象)
- 执行构造函数内的代码(给这个新的对象添加属性)
- 返回新对象
实现继承的几种方式
原型继承
function Foo () {
this.name = 'foo';
}
Foo.prototype.show = function () {
console.log(this.name);
}
function Bar () {}
Bar.prototype = new Foo();
var bar = new Bar();
console.log(bar instanceof Foo); // true
function Foo () {
this.name = 'foo';
this.age = 17;
}
Foo.prototype.show = function () {
console.log(this.name);
}
var Bar = Object.create(Foo);
console.log(Bar.name, Bar.age); //foo, 17
//Bar没有构造函数,因此不能执行new操作,而且不具有show属性
var Peo = {
name: 'peo',
say: function() {}
}
var Son = Object.create(Peo);
借用构造函数实现继承
function Super () {
this.name = 'name';
}
Super.prototype.show = function () {
console.log(this.name);
}
function Sub () {
Super.call(this);
}
var sub = new Sub();
// 相当于在new一个Sub对象的时候,执行一下Super函数,这种方式只会继承构造函数内部定义的name属性
组合继承
利用原型继承实现对原型属性和方法的继承, 借用构造函数来实现对实例属性的继承
function Super (name) {
this.name = name;
}
Super.prototype.show = function () {
console.log(this.name);
}
function Bar (name) {
Super.call(this, name);
}
Bar.prototype = new Super();
var bar = new Bar('bar');
console.log(bar.name); // bar
bar.show(); // bar
递归
arguments.callee();
闭包是指有权访问另一个函数作用域的变量的函数