论坛首页 AJAX版 JavaScript

JavaScript一切都是对象么?

浏览 1990 次
精华帖 (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里什么是对象???
   
时间:2007-07-27
js里基本所有的都是对象,就算primitive的string,number,boolean,其实也就跟Immutable对象差不多。

function 也是对象。不过是具有一个[[call]]特性,可以被调用。
   
0 请登录后投票
时间: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>
   
0 请登录后投票
时间:2007-07-27
hax 写道
js里基本所有的都是对象,就算primitive的string,number,boolean,其实也就跟Immutable对象差不多。

function 也是对象。不过是具有一个[[call]]特性,可以被调用。


那你能告诉我new到底是个什么东西?
为什么var person=new Person()以后,person就没有prototype这样的属性了?
   
0 请登录后投票
时间: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>


这些用法和特性我都知道,只是不明白它的内部机理。
   
0 请登录后投票
时间:2007-07-27
prototype属性只有函数有。
对象也有一个prototype链。但是不可访问。
   
0 请登录后投票
时间:2007-07-27
jindw 写道
prototype属性只有函数有。
对象也有一个prototype链。但是不可访问。


不是一切皆为对象么,怎么又分函数了?
Object,String....都有prototype属性,他们也属于函数了?
   
0 请登录后投票
时间:2007-07-27
没错,可以这么说。


严格的说,只有构造器(构造函数)有显示的prototype属性。
自定义函数都也是构造器,所以也都有prototype属性。
   
0 请登录后投票
时间: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
   
0 请登录后投票
时间:2007-07-27
jindw 写道
没错,可以这么说。


严格的说,只有构造器(构造函数)有显示的prototype属性。
自定义函数都也是构造器,所以也都有prototype属性。



严格的说,(根据ECMA-262规范),所有函数初始化后,都有一个prototype属性,其值为new Object()。
   
0 请登录后投票
论坛首页 AJAX版 JavaScript

跳转论坛:
JavaEye推荐