恩,闪亮登场~~~
JavaScript 如何为像我一样的先接触面向对象语言的孩子们提供编程舒适性?
构造函数、类和原型
Java和JavaScript都支持new关键字,允许我们创建预先定义的对象的实例,终于找到java的感觉了。
在java中所有东西(除了少数的基本类型)都是一个对象,最后都继承自java.lang.Object类。我们首先声明类型,然后使用构造函数实例化:
MyObject myObj = new MyObject(art1,arg2);
JavaScript也有对象和类的概念,但是没有内建继承的概念。事实上,每个JavaScript对象是相同基类(一个有能力在运行时将成员字段和函数与自己绑在一起的类)的实例。所以,和java不同,可以在运行时给对象分配任意的属性:
MyJavaScriptObject.completelyNewProperty = “something”;
一段看起来与java声明很相似的东西:
var myObj = new MyObject();
但是我们没有定义类MyObject,而是定义了一个同名的函数。这里是一个简单的构造函数:
function MyObject(name,size)
{
this.name = name; /*作为MyObject的一个成员*/
this.size = size;
}
随后我们可以这样调用它:
var myObj = new MyObject(“tiddles”,”7.5 meters”);
alert(“size of”+myObj.name+”is”+myObj.size);
一段代码结束了,那么如果我们想初始化alert()的调用呢?一种习惯做法是在构造函数中声明这个函数:
function MyObject(name,size)
{
this.name = name;
this.size = size;
this.tellSize = function()
{
alert(“size of”+myObj.name+”is”+myObj.size);
}
}
var myObj = new Object(“tiddles”,”7.5 meters”);
myObj.tellSize();
上面的一段代码可以工作,但有问题必须注意:每当我们创建一个MyObject的实例时,我们都会创建了一个新的函数,这样势必会存在内存泄漏问题。还有就是我们在无意中创建了一个闭包(closure)(关于这个将在后面的博文中详细解说,现在不必在意)。
由于这个原因我们应该考察一下更加安全的替代品:原型(prototype)。
原型是JavaScript对象的一个属性,在面向对象语言中没有对等物。函数和属性可以与构造函数的原型关联起来。然后原型和new关键字协同工作,当使用new调用函数时,函数原型的所有属性和方法会附加到结果对象上。听起来好怪啊,但还是来看看下面的代码吧:
function MyObject(name,size)
{
this.name = name;
this.size = size;
}
MyObject.prototype.tellSize = function() /*函数原型(MyObject.prototype)的属性方法*/
{
alert(“size of”+this.name+” is ”+this.size);
}
var myObj = new MyObject(“tiddles”,”7.5 meters”);/*这个时候原型的属性tellSize便附加到结果对象上了,简单吧*/
myObj.tellSize();
补充下:关键字this在运行时确定为对象的实例;顺序问题,在声明构造函数之后,我们才能引用原型,对象只继承那些在调用构造函数之前已经添加到原型上的东西。原型可以在两次调用构造函数之间进行修改,并且可以附加任何东西(不仅仅是函数)到原型上:
MyObject.prototype.color = “red”;
var obj1 = new MyObject();
MyObject.prototype.color = “blue”;
MyObject.prototype.soundEffect = “bo000oing!!”;
var obj2 = new MyObject();
总结:使用原型来为JavaScript对象定义类似于类的行为,是一条安全和可靠的路径。下一篇中我们将扩展某些确定的内建类(即那些由浏览器自身实现和通过JavaScript暴露出来的类,也称作宿主对象)的原型。休息休息,休息一下~~~
JavaScript 如何为像我一样的先接触面向对象语言的孩子们提供编程舒适性?
构造函数、类和原型
Java和JavaScript都支持new关键字,允许我们创建预先定义的对象的实例,终于找到java的感觉了。
在java中所有东西(除了少数的基本类型)都是一个对象,最后都继承自java.lang.Object类。我们首先声明类型,然后使用构造函数实例化:
MyObject myObj = new MyObject(art1,arg2);
JavaScript也有对象和类的概念,但是没有内建继承的概念。事实上,每个JavaScript对象是相同基类(一个有能力在运行时将成员字段和函数与自己绑在一起的类)的实例。所以,和java不同,可以在运行时给对象分配任意的属性:
MyJavaScriptObject.completelyNewProperty = “something”;
一段看起来与java声明很相似的东西:
var myObj = new MyObject();
但是我们没有定义类MyObject,而是定义了一个同名的函数。这里是一个简单的构造函数:
function MyObject(name,size)
{
this.name = name; /*作为MyObject的一个成员*/
this.size = size;
}
随后我们可以这样调用它:
var myObj = new MyObject(“tiddles”,”7.5 meters”);
alert(“size of”+myObj.name+”is”+myObj.size);
一段代码结束了,那么如果我们想初始化alert()的调用呢?一种习惯做法是在构造函数中声明这个函数:
function MyObject(name,size)
{
this.name = name;
this.size = size;
this.tellSize = function()
{
alert(“size of”+myObj.name+”is”+myObj.size);
}
}
var myObj = new Object(“tiddles”,”7.5 meters”);
myObj.tellSize();
上面的一段代码可以工作,但有问题必须注意:每当我们创建一个MyObject的实例时,我们都会创建了一个新的函数,这样势必会存在内存泄漏问题。还有就是我们在无意中创建了一个闭包(closure)(关于这个将在后面的博文中详细解说,现在不必在意)。
由于这个原因我们应该考察一下更加安全的替代品:原型(prototype)。
原型是JavaScript对象的一个属性,在面向对象语言中没有对等物。函数和属性可以与构造函数的原型关联起来。然后原型和new关键字协同工作,当使用new调用函数时,函数原型的所有属性和方法会附加到结果对象上。听起来好怪啊,但还是来看看下面的代码吧:
function MyObject(name,size)
{
this.name = name;
this.size = size;
}
MyObject.prototype.tellSize = function() /*函数原型(MyObject.prototype)的属性方法*/
{
alert(“size of”+this.name+” is ”+this.size);
}
var myObj = new MyObject(“tiddles”,”7.5 meters”);/*这个时候原型的属性tellSize便附加到结果对象上了,简单吧*/
myObj.tellSize();
补充下:关键字this在运行时确定为对象的实例;顺序问题,在声明构造函数之后,我们才能引用原型,对象只继承那些在调用构造函数之前已经添加到原型上的东西。原型可以在两次调用构造函数之间进行修改,并且可以附加任何东西(不仅仅是函数)到原型上:
MyObject.prototype.color = “red”;
var obj1 = new MyObject();
MyObject.prototype.color = “blue”;
MyObject.prototype.soundEffect = “bo000oing!!”;
var obj2 = new MyObject();
总结:使用原型来为JavaScript对象定义类似于类的行为,是一条安全和可靠的路径。下一篇中我们将扩展某些确定的内建类(即那些由浏览器自身实现和通过JavaScript暴露出来的类,也称作宿主对象)的原型。休息休息,休息一下~~~