什么是js原型:函数的一个属性,在函数的创建过程中由js编译器自动添加。具体来说,就是我们经常使用的,prototype属性,这个属性怎么得来的呢?
当生产一个function对象的时候,就可以看到它了。
js functiion对象的创建-1
要使用function对象,必须先创建一个对象,有几种方式:
1、var A = function(){};//字面量,匿名函数,推荐
2、function A(){};//函数声明
3、var A = new Function(//这里是函数体)//实例化函数对象
那么,我们来看第一种方式做了什么
分解动作:
1、x = new Object();//开辟一块内存,然后创造一个对象
2、x.constructor = A;//将x的构造函数指向A的函数实体
3、A.prototype = x;//A的原型指向新开辟的对象
js function对象的创建-2
几点说明:
1、每创建一个function的对象,会自动为其增加一个“name”的属性,采用方法1,name= undefined,方法二才会有值。
2、_proto_属性是隐性属性,除了FF以外,没有方法调用到。
3、每次new一个function其实消耗的空间是如上图所示的,其实创建的是两个对象。
js 里面的构造函数
只要是个函数,他就可以使构造函数,他具有函数的功能,也能够返回值,不过这里要特别注意,如果构造函数返回基本类型的值,这个值会被忽略,如果
构造函数返回一个对象,OK,你悲剧了,如下图
实例属性和静态属性(原型方法)、类属性-1
这几个概念在js里面并不是很明晰,在强类型语言里面,多使用static来做标识。
我们来看以下代码:
var A = function(){//this is a class
this.instanceProp = 1;//this is a instance,chrome will no show when undefined
this.instanceFunction = function(){};//this is a instance function
}
A.prototype.staticFn = function(){}//this is a static function
A.classFn = function(){}//this is a class function
var a = new A();
实例属性和静态属性(原型方法)、类属性-2
分解动作
//实例化A类,此时,第一步,将构建一个空的object
//第二步将执行,a._proto_= A.prototype
//第三步将执行构造函数,将实例化方法返回到当前实例上,也就是A.apply(a,[args]);
//第四步是修正构造函数指向,a._pro_.constructor =A;
//也就是说,var a = new A();分解为:
var a = new Object();
a._pro_=A.prototype;
A.call(a);
a._proto_.constructor = A;
实例属性和静态属性(原型方法)、类属性-3
上面一步的内存结构为,大家注意消化下内存中的引用关系
原型(链)继承
那么当我们使用原型链继承的时候发生了什么?
一般我们的原型链继承,我们这么写:
var B =function(){
this.bslnsProp = "xx";
};
B.prototype = new A();
直接看内存模型吧