|
锁定老贴子 主题:JavaScript一切都是对象么?
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
时间:2007-07-27 关键字: prototype
学JavaScript,很多人都提到要抛弃类的概念,把javascript里的一切都看成对象。
可是对象又是什么呢?
function Person1(){
}
Person是对象么?
var Person2 = function(){
};
Person是对象么? var person = new Person(); person是对象么? 有一句话提到,每个对象都有个prototype属性,这个属性也是个对象 Person1有prototype属性么? Person2有prototype属性么? person有prototype属性么? 某个对象的prototype属性能是Person1么 某个对象的prototype属性能是Person2么 某个对象的prototype属性能是person么 谁能告诉我,javascript里什么是对象??? 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间:2007-07-27
js里基本所有的都是对象,就算primitive的string,number,boolean,其实也就跟Immutable对象差不多。
function 也是对象。不过是具有一个[[call]]特性,可以被调用。 |
|
| 返回顶楼 | |
|
时间:2007-07-27
js的每个对象包括你自己生成的对象,他们的基类都是object,prototype是object的属性,所以每个对象都有prototype属性,prototype说白了就是当你new一个对象时,prototype会把他下的内容都绑定到这个对象,prototype的特点时,new出来的所有对象都共享prototype的内容,只是this指向的不同
上例子
<script language="javascript" type="text/javascript">
var test = function(name,age){
this.name = name || 'aa';
this.age = age || 58;
}
test.prototype = {
share : '都是这个prototype',
show : function(){
alert(this.name+" "+this.age);
}
}
var t = new test('zhan',25);
var t1 = new test('a',2);
t.show();
t1.show();
alert(t.share);
alert(t1.share);
</script>
|
|
| 返回顶楼 | |
|
时间:2007-07-27
hax 写道 js里基本所有的都是对象,就算primitive的string,number,boolean,其实也就跟Immutable对象差不多。
function 也是对象。不过是具有一个[[call]]特性,可以被调用。 那你能告诉我new到底是个什么东西? 为什么var person=new Person()以后,person就没有prototype这样的属性了? |
|
| 返回顶楼 | |
|
时间:2007-07-27
campaign 写道 js的每个对象包括你自己生成的对象,他们的基类都是object,prototype是object的属性,所以每个对象都有prototype属性,prototype说白了就是当你new一个对象时,prototype会把他下的内容都绑定到这个对象,prototype的特点时,new出来的所有对象都共享prototype的内容,只是this指向的不同
上例子
<script language="javascript" type="text/javascript">
var test = function(name,age){
this.name = name || 'aa';
this.age = age || 58;
}
test.prototype = {
share : '都是这个prototype',
show : function(){
alert(this.name+" "+this.age);
}
}
var t = new test('zhan',25);
var t1 = new test('a',2);
t.show();
t1.show();
alert(t.share);
alert(t1.share);
</script>
这些用法和特性我都知道,只是不明白它的内部机理。 |
|
| 返回顶楼 | |
|
时间:2007-07-27
prototype属性只有函数有。
对象也有一个prototype链。但是不可访问。 |
|
| 返回顶楼 | |
|
时间:2007-07-27
jindw 写道 prototype属性只有函数有。
对象也有一个prototype链。但是不可访问。 不是一切皆为对象么,怎么又分函数了? Object,String....都有prototype属性,他们也属于函数了? |
|
| 返回顶楼 | |
|
时间:2007-07-27
没错,可以这么说。
严格的说,只有构造器(构造函数)有显示的prototype属性。 自定义函数都也是构造器,所以也都有prototype属性。 |
|
| 返回顶楼 | |
|
时间:2007-07-27
weiqingfei 写道 那你能告诉我new到底是个什么东西? 为什么var person=new Person()以后,person就没有prototype这样的属性了? 不要混淆。Function对象上的prototype是一个对象属性,而所有对象上都有的,是一个内部属性,记做[[prototype]]。内部属性是不能访问的,某些实现,如SpiderMonkey和JavaScriptCore,会有一个__proto__属性,基本上可以看成是[[prototype]]。 对于function f来说,new f()所产生的新对象,其内建属性[[prototype]]的值会被赋值为f.prototype的值。 __proto__属性是一个对象,则它也有__proto__,这样就构成了prototype链。 x.isPrototypeOf(y)可以检测x是否是y的prototype链上的一环。 也就是说:
var apt = {x:1, y:2};
function A(x) {
this.x = x;
}
A.prototype = apt;
var a = new A(10);
a.x == 10 // true
a.y == 2 // true,实际访问的是a.__proto__.y,也就是A.prototype.y,也就是apt.y
a.toString() // [Object object],实际调用的是a.__proto__.__proto__.toString(),也就是apt.__proto__.toString(),也就是Object.prototype.toString()
a.__proto__ === apt // 如果js引擎支持__proto__,则返回 true
apt.isPrototypeOf(a) // true
apt.__proto__ === Object.prototype // true
a.__proto__.__proto__ === Object.prototype // true
Object.prototype.isPrototypeOf(a) // true
A.__proto__ === Function.prototype // true *
A.__proto__.__proto__ === Object.prototype // true *
Function.prototype.isPrototypeOf(A) // true
Object.prototype.isPrototypeOf(A) // true
Object.__proto__ === Function.prototype // true, 因为Object是一个函数
Function.__proto__ === Function.prototype // true, 因为Function是一个函数
Function.prototype.isPrototypeOf(Object) // true
Function.prototype.isPrototypeOf(Function) // true
Object.prototype.__proto__ === null // true, Object.prototype是所有对象的原型,它自己没有原型
typeof Function.prototype === 'function' // true, Function.prototype具有[[call]]
Function.prototype.isPrototypeOf(Function.prototype) // false
Function.prototype instanceOf Function // false
* 在SpiderMonkey下,对于closure(即除了global function 以外的 function) c,有 c.__proto__.__proto__ === Function.prototype c.__proto__.__proto__.__proto__ === Object.prototype |
|
| 返回顶楼 | |
|
时间:2007-07-27
jindw 写道 没错,可以这么说。
严格的说,只有构造器(构造函数)有显示的prototype属性。 自定义函数都也是构造器,所以也都有prototype属性。 严格的说,(根据ECMA-262规范),所有函数初始化后,都有一个prototype属性,其值为new Object()。 |
|
| 返回顶楼 | |








