javascript中只有对象(Object),没有类的概念。function关键字只是定义函数对象的一个变种形式。默认通过function关键字产生的对象会作为window对象的一个属性存在。当我们使用new 关键字作用于某个函数对象,将产生一个新的对象,可以将这个对象理解成一个新的范围,这样在这个新的范围内,this不再指向默认的window 对象,而是我们新产生的对象。
一个实例胜过千万句空话,让我们用事实说话。
实例1-类似java成员函数的实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
function Person(name) { this.name = name ; //B()类似java的成员函数。 this.B = function() { console.log(this + " B()"); } //重写toString,便于标识 this.toString=function() { return "[" + this.name + "]"; } } var p = new Person("javacoder.cn"); p.B(); |
输出为:
[javacoder.cn]? B()
实例2-类似java的共有静态函数的实现
1 2 3 4 5 |
Person.C = function(){ //this 指代整个Person函数对象, //javascript的函数也是对象 console.log(this + "C()"); } |
输出为:
function Person(name) {
this.name = name ;
this.B = function() {
console.log(this + "? B()");
}
//重写toString,便于标识
this.toString=function() {
return "[" + this.name + "]";
}
}?? C()
Function对象的toString()方法会将整个函数的定义输出。
实例3-类似java成员函数的另一种实现
1 2 3 4 5 |
//类似java的成员函数,和函数B的效果类似, //但是方便于prototype继承 Person.prototype.D = function() { console.log(this + "D()"); } |
输出结果为:
[javacoder.cn]? D()
实例4-动态给对象添加函数,java没有的功能
1 2 3 4 5 |
//定义一个只属于对象p的函数,java没有对应的用法 p.E = function () { console.log(this + "E()"); A("from p.E"); } |
输出为:
[javacoder.cn] E()
实例5-类似java静态私有方法的实现。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
function Person(name) { this.name = name ; //定义了一个只能在Person内部使用的工具函数 //类似java的私有静态函数 A = function(str) { //this指向window对象,费解????? console.log(this + ", A() ," + str); } //类似java的成员函数 this.B = function() { A("js"); console.log(this + "B()"); } } var p = new Person("javacoder.cn"); p.B(); |
输出为:
[object Window], A() ,js
[object Object]B()
我也是js初学者,欢迎交流
Posted in: WEB practise
Comments are closed.