开始之前我先明确个问题。如下代码
见如下代码:
<
SCRIPT LANGUAGE
=
"
JavaScript
"
>
<!--
Person.type = " person " ;
Person.writeType = function () {
document.writeln( this .type);
}
// var Person = function(){} // 如果这样定义会报错,可以看看前面文章,函数的预编译。
function Person() {}
Person.writeType();
alert( typeof (Person));
for ( var key in Person) {
alert(key);
}
var person = new Person();
// -->
</ SCRIPT >
在这里Person是个函数,但我们还可以定义它的属性(type)。而Person有Object实例的特性(for in、可以定义属性),但Person不是Object的实例。
<!--
Person.type = " person " ;
Person.writeType = function () {
document.writeln( this .type);
}
// var Person = function(){} // 如果这样定义会报错,可以看看前面文章,函数的预编译。
function Person() {}
Person.writeType();
alert( typeof (Person));
for ( var key in Person) {
alert(key);
}
var person = new Person();
// -->
</ SCRIPT >
见如下代码:
<
SCRIPT LANGUAGE
=
"
JavaScript
"
>
<!--
Object.prototype.toString = function () { return 'myToString'} ;
function Person() {
}
Person.prototype.toString = function () { return 'Person'} ;
var o = new Person();
alert(o);
alert(Person)
Person.toString = function () { return 'Person toString'} ;
alert(Person)
// -->
</ SCRIPT >
<!--
Object.prototype.toString = function () { return 'myToString'} ;
function Person() {
}
Person.prototype.toString = function () { return 'Person'} ;
var o = new Person();
alert(o);
alert(Person)
Person.toString = function () { return 'Person toString'} ;
alert(Person)
// -->
</ SCRIPT >
我理解function返回的数据类型是和Object同等级的数据类型。它有Object实例(new Object())的一些特性,但它不是Object的实例,因为它没有继承Object.prototype.toString=function(){return 'myToString'};但我们Person.toString=function(){return 'Person toString'};改变了覆盖了方法。
在《javascript权威指南》中,作者用这个特性实现了“类方法、类变量”static方法,与java中不同,这些方法不能用new Person()来调用。
Object function 同等级 function可以定义属性,可以(for in)
new Object() new function() 同等级 new function()继承了Object的prototype, 也会继承 function的prototype
小例子。看了原型对象就很清楚了啊。 原型对象最好在代码最前面定义,很容易被覆盖啊!
<
SCRIPT LANGUAGE
=
"
JavaScript
"
>
<!--
var Person = function () {
this .name = 'Person的构造函数中属性name';
this .getName = function () {
return this .name;
}
// this.toString=function(){} //你把注释去掉看看效果
}
Person.name = " Person " ;
Person.toString = function () { return this .name + '的类方法'} ; // 我可以用this啊
alert(Person.toString()) // 类方法
var o = new Person();
alert(o.getName()); // 构造函数中的方法
alert(o); // 访问toString方法 先找 对象中 构造函数中 Person的prototype中 Object的prototype中
Object.prototype.toString = function () { return 'Object的prototype中的toString'} ;
alert(o); // Object的prototype中
Person.prototype.toString = function () { return 'Person的prototpe中的toString'} ;
alert(o);
o.toString = function () { return '我覆盖了toString方法了啊'}
alert(o);
alert('我不能访问前面的toString了。如果有super就好了!');
// 其实还是可以访问到被覆盖的原型的。那样太复杂了。
// -->
</ SCRIPT >
<!--
var Person = function () {
this .name = 'Person的构造函数中属性name';
this .getName = function () {
return this .name;
}
// this.toString=function(){} //你把注释去掉看看效果
}
Person.name = " Person " ;
Person.toString = function () { return this .name + '的类方法'} ; // 我可以用this啊
alert(Person.toString()) // 类方法
var o = new Person();
alert(o.getName()); // 构造函数中的方法
alert(o); // 访问toString方法 先找 对象中 构造函数中 Person的prototype中 Object的prototype中
Object.prototype.toString = function () { return 'Object的prototype中的toString'} ;
alert(o); // Object的prototype中
Person.prototype.toString = function () { return 'Person的prototpe中的toString'} ;
alert(o);
o.toString = function () { return '我覆盖了toString方法了啊'}
alert(o);
alert('我不能访问前面的toString了。如果有super就好了!');
// 其实还是可以访问到被覆盖的原型的。那样太复杂了。
// -->
</ SCRIPT >