漫漫学习之路何其久远,只有抛弃浮躁,静下来看书方能有所收获.
写此文章仅为记录自身学习之路,文章内容不是固定的,每当我发现新的东西就会添加进去.文章也可能有错误,希望看到的兄弟能帮我指出,在此小弟谢谢了.
1.
每个对象(除了null)都和"另一个对象"(原型)相关联, 每个对象都从原型继承属性.
//但要特别注意的是:下面的理解是错误的 {每个对象拥有一个prototype属性,它的值为另一个对象.}
//每个对象并没有这个属性.
//目前我发现的只有构造函数才有这个prototype属性
2.
通过new和构造函数创建的对象的原型就是构造函数的prototype的值;//注意是构造函数才有
但是注意的是:通过对象直接量创建的对象(就是使用{..}创建的对象)和通过new Object()创建的对象拥有同一个原型,可以通过Object.prototype获得对原型的引用.
3.
没有原型的对象个数不多,Object.prototype指向的对象就是其中之一.
所有的内置构造函数(和大多数自定义构造函数)都具有一个继承自Object.prototype的原型.这也就是为什么每个对象都有toString()方法的原因(继承自Object.prototype);
4.
通过改变构造函数的prototype属性,能够让其的实例直接使用这个原型上的属性和方法
例子1:
function A(){}
var b = new A();
alert(b.n)//返回undefined
A.prototype.n = 1;为原型对象添加一个n属性
alert(b.n)//返回1
但是要注意的是,要让实例直接生效,不能将prototype赋值为另一个对象,否则将会在下次使用这个构造函数新建一个对象时,才会生效
例子2:
functionA(){}
varb = new A();
alert(b.n)//返回undefined
A.prototype = {n:2};//{n:2}创建一个新对象,将这个对象赋值给prototype
alert(b.n)//返回undefined
var c = new A();//使用A创建一个新对象
alert(c.n)//返回2
4.
对象具有自己定义的属性,也有一些属性是从原型继承而来的.如果自身定义了一个x = 1属性,而原型也有一个x=2属性,则自身的x=1属性会覆盖继承来的x=2属性.alert(a.x)返回1;
在Javascript中,只有在查询属性的时候才会体会到继承的存在,而设置属性和继承没有关系.这是javascript中一个重要的特性.
5.
实现继承
例子1:
function A(a) { this.a = a; } function B(b) { this.b = b; } B.prototype =new A(1);//将子构造函数的原型设置为一个A创建的对象,也就继承了A的属性和方法 var c = new B(2); alert(c.a);//返回1 alert(c.b);//返回2
但是这样就不能改变a的值了,没次a的初始值都为1;
可以像下面这么做,改变this的指向
例子2:
function A(a) { this.a = a; } function B(a,b) { this.func = A;//为调用B创建的对象添加一个func属性,值为A函数 this.func(a);//此时调用A函数,注意此时A函数中的this指向的就是调用B创建的对象了,所以就修改了a的值 this.b = b; } B.prototype =newA(); var c = new B(4,2); alert(c.a);//返回4 alert(c.b);//返回2
javascript为了简化上述步骤,可以使用call()方法
每个函数都有call()和 apply()方法
例子3:
上面的代码可以替换为
…
function B(a,b) { A.call(this,a); //或者替换成A.apply(this,[a]); this.b = b; }
…
A.call(this,a);或者A.apply(this,[a]);
的作用类似于
this.func = A; this.func(a); delete this.func;
call和apply不同在于后续的参数
在第一个参数之后的所有参数就是要传入带调用的函数值
不同在于apply的实参都放在一个数组当中,比如 f.apply(对象,[参数1,参数2….])