js和其他语言不同,没有class的概念,要想形成面向对象,就必须依靠他自身一个非常重要的概念,也是不好理解的一个东西。那就是原型prototype,使用他可以模拟继承和类的实现。下面先看一个简单的例子:
function Person (name) {
this.name = name;
}
Person.prototype = {
getName:function () {
return this.name;
}
}
var zhang = new Person("zhangsan");
console.log(zhang.getName());
运行结果:zhangsan
有两种继承方式,原型式继承,构造函数式继承
原型链继承,看下面这个例子:
function Child () {
this.age = 12;
}
function Parent () {
this.name = 'mike';
}
Child.prototype = new Parent();//child继承Parent,通过原型,形成链条
var test = new Child();
console.log(test.age);
console.log(test.name);
两个函数用prototype形成链条,形成了继承。
下面看看这个原型式继承
function obj (o) {
function F () {};
F.protype = o;
return new F();
}
var box = {
name:'trigkit4',
arr:['brother','sister','baba'];
};
var b1 = obj(box);
console.log(b1.name);
b1.name = 'mike';
console.log(b1.name);
console.log(b1.arr);
b1.arr.push('parents');
console.log(b1.arr);
var b2 = obj(box);
console.log(b2.name);
console.log(b2.arr);
//原型式继承首先在obj()函数内部创建一个临时性的构造函数,然后将传入的对象作为这个构造函数的原型,最后返回这个临时类型的一个新实例
//寄生组合式继承
function obj (o) {
function F () {};
F.prototype = o;
return new F();
}
function create (parent,test) {
var f = obj(parent.prototype);//创建对象
f.constructor = test;//增强对象
}
function Parent (name) {
this.name = name;
this.arr = ['brother','sister','parents'];
}
Parent.prototype.run = function () {
return this.name;
};
function Child (name,age) {
Parent.call(this,name);
this.age = age;
}
inheritPrototype(Parent,child);//通过这里实现继承
var test = new Child('trigkit4',21);
test.arr.push('nephew');
console.log(test.arr);
console.log(test.run());//只共享了方法
var test2 = new Child('jack',22);
console.log(test2.arr);//引用问题解决
依靠原型式的继承,中用new 操作符产生的对象,会向上查找,查找他原型链上的属性,这样就实现了继承,如果删除本对象上的属性,是不会影响到父类型属性的。
对象把函数当作方法的时候,this指向的就是那个对象。
作用域
1.全局作用域
2.函数作用域
3.evel作用域
我在学习js继承的时候,看了好多资料,但是发现根本记不住,我只有把其中的几个理解下来,在图后面更多的。现在我先缕一缕:要面向对象,那得先有对象,对象可以通过工厂模式还有构造函数模式等产生出来,也可以通过原型模式产生,有了对象之后就可以实现面向对象的重要特性,继承,这里我只掌握的原型模式的继承,就比如我上面举的例子,每个对象都有一个prototype我把他指向另外一个函数,这样就实现了从这个函数到那个函数的继承,因为每个对象都是Object的实例,所有每个对象都有tostring和valueof这些方法。
说的如果有不对的,恳请大家指正、