javascript之继承

漫漫学习之路何其久远,只有抛弃浮躁,静下来看书方能有所收获.

写此文章仅为记录自身学习之路,文章内容不是固定的,每当我发现新的东西就会添加进去.文章也可能有错误,希望看到的兄弟能帮我指出,在此小弟谢谢了.大笑


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;


 

 callapply不同在于后续的参数

在第一个参数之后的所有参数就是要传入带调用的函数值

不同在于apply的实参都放在一个数组当中,比如 f.apply(对象,[参数1,参数2….])


你可能感兴趣的:(javascript之继承)