javascript基于prototype原型的继承链

javascript中类与父类之间的继承都是由其prototype对象来链接起来继承的,默认情况下所有的类都继承Object对象,包括自定义对象,Object对象也是所有对象的最顶层对象。但这一点没有什么让人感觉惊艳的,因为大多数编程语言基本都是如此。也可以把prototype认为是所有javascript对象都拥有的一个属性,这个属性帮助对象自身继承创建此对象的构造器或者说是类的原型中所定义的属性成员和方法成员。但是javascript基于prototype的继承不像其他高级语言的继承那么繁琐,javascript的继承显得简约而又简单。

var num=new Number(100);创建一个对象之后立刻调用JS中的预先为我们定义好Number()函数,为Number()函数传递一个参数100,函数启动自身的构造器,初始化一个数字与新建的这个对象关联起来,num变量指向这个对象,同时,这个对象便获取继承到了Nunber()函数预定义好的prototype对象所指向的方法。

函数也是对象,函数也可以拥有方法(函数)和属性,Number.prototype.toFixed();返回toFixed(){…..},明显的JS已经为我们定义好了一个原型,可以拿来直接使用的,那么很自然的由Number函数构造出来的对象也将继承Number函数的prototype定义的方法,num.toFixed(index)证明其确实是这样。

prototype是javascript提供开发人员的一个显式的继承接口,那么自定义对象便有了更多的扩展空间,既然每个对象都拥有了一个显式的prototype,这样大家只要有了构造函数便就有了一直向上延伸的继承链了,Number()函数是预先为开发者定义好的函数,为这个函数定义一个新的prototype这样Number函数那些少得可怜方法就可以由我们自己扩展了,Prototype框架对Number类的扩展的一部分: 继续阅读 »

javascript对象构造函数检测instanceof

instanceof判定一个对象是否为某一个类的实例。

var num=1 === var num=Number(1)

数字1是直接调用Number函数构造出来的。

var num=1 !== var num=new Number(1)//false

var num=1 == var num=new Number(1)//true

var num=new Number(15)这一步new 创建一个对象 这个对象在调用 Object()函数返回一个对象,这个对象在调用Number函数,为Number函数传递一个参数15。之后把这个对象赋值为15,之后在把num变量指向这个对象,
———————
var num=new Number(15);
alert(num instanceof Number); //true
alert(num instanceof Object); //true
所以mymickey理解的是这个num指向的对象调用了两个函数对象一个是Object()函数,之后才是Nunber()函数;

alert(num.constructor)返回的是

function Number() {
[native code]
}

mymickey想:开始第一次调用Object函数的时候num.constructo应该是Object()才对,但是最后还是调用了一次Number();所以结果才会是:function Number() {[native code]}。

setTimeou中this指针问题

setTimeout()方法是一个能让其中第一个参数按照第二个参数指定的时间调用的,也就是说setTimeout方法能把开发者给予的时间值按照计划调用第一个参数。setTimeout方法也是window对象的一个预定义方法,它只能被window这个对象来调用。

var a=123
window.setTimeout(alert(this.a),1000)

给window对象添加一个属性a,1秒后显示123,其中this的确是指向window对象,在javascript中函数中的this永远指向调用这个函数的对象。当javascript自定义对象或者说是类的时候情况就有所不同了,下面的代码使用 setTimeout方法递归一个函数:

function classA(a,b){
	this.A=a;
	this.B=b;
}
classA.prototype={
        classB:function(){
        alert(this.A)
        window.setTimeout(this.classB,this.B)
		}
	}
var a=new classA('aaa',1000)	;
a.classB();

代码看起来好像没什么问题setTimeout方法的参数传递this.classB这个对象的一个方法,对象初始化的时候显示正确,但是过了一秒后,第二个提示框显示的却是undefined,在这里setTimeout的第一个参数this.classB指向了一个函数,setTimeout方法将this.classB指向的这个函数原原本本的复制了一份之后传递进去。修改一下代码加入‘alert(‘this==window ‘+(this==window))’这样一行代码。
继续阅读 »

返回顶部