标签:
在传统的静态语言中,类相当于“模子”,用class来定义,而实例相当于“模具”,就是说实例是通过“模子”class来生成的。但是在js中,并没有class关键字,换句话说js中没有类的概念。但得益于js强大的原型机制,js是可以模拟静态语言中的类的。
先来看看函数对象Function,对象Function上拥有一个原型对象prototype,即
Function.prototype = {
call:function(){},
apply:function(){},
......
__proto__:Object
}
每个函数function F(){}都是通过Function对象来构造的,也就是说Function.prototype被克隆在函数F里面了,在F里,会有一个专门的属性存储Function.prototype,如下所示
F.__proto__ = Function.prototype;
正常情况下如果尝试访问F.call, F.apply会导致失败,因为F函数对象上没有这个方法,但原型机制会在在F上访问失败的时候,会将访问请求委托给F.__proto__,即Function.prototype,这时候便找到了call方法与apply方法了。
同理,如果访问F.toString, F函数对象上没有该方法,会委托到F.__proto__,即Function.prototype,此时Function.protoype仍然没有toString方法,会继续委托给F.__proto__.__proto__,即Function.protoype.__proto__,即Object对象。
展开Function.prototype, 如下
Function.prototype = {
call:function(){},
apply:function(){},
......
__proto__:{
toString:function(){},
valueOf:function(){},
...
}
}
这个时候便找到了toString方法。。。对原型机制简单的理解就是沿着这样的链条一直访问下去F.__proto__.__proto__......__proto__,直到最终找到要访问的属性,而Object对象里面是没有__proto__的,也就是说Object对象就是尽头了,因此Object对象也是我们所说的顶层对象,所有对象都会继承自Object对象。
F.__proto__代表的是F继承的对象,而F.prototype代表的是可以被继承的对象,展开F.prototype,如下
F.prototype={
constructor: function func(){},
__proto__:Object
}
在js中,实例化一个函数的写法如下:
var obj = new F();
克隆模式指的是F的原型对象克隆到obj上了,即:obj.__proto__ = F.prototype,这样通过obj可以访问到obj.toString与obj.valueOf等方法。
用js代码模拟new Func()这个过程,先看看正常的写法:
function Person(name,age){
this.name = name;
this.age = age;
}
Person.prototype.sayName = function(){
console.log(this.name);
}
var obj1 = new Person("Li",34);
其底层实现机制的模拟写法:
function createObj(func){
var obj = {}; //先新建一个对象
obj.__proto__ = func.prototype; //将函数的原型对象克隆过来
var Func = Array.prototype.shift.apply(arguments); //将第一个参数移出去并返回给Func,此时arguments就只剩下要传给Func的参数了
Func.apply(obj,arguments); //调用apply方法强制改变this的指向
return obj; //返回
}
var obj = createObj(Person,"Fu",22);
console.log(obj.age); //22
console.log(obj.sayName()); //Fu
总结来说:
①原型机制指的是,在访问F.xxxx的时候,会沿着F.__proto__.......__proto__一直访问下去,直到找到xxxx或者是到了尽头。
②克隆模式指的是,var sample = new Func();这句话的过程是会先生成一个对象obj,使得obj.__proto__ = Func.prototype,这样obj就继承了Func的原型,再经过一定的处理后,返回obj。
标签:
原文地址:http://www.cnblogs.com/xiaodianxie/p/5136980.html