Flykye.前端历程

front-end..

导航

Firefox下的__proto__

  <script type="text/ecmascript">
/*
proto对象只不过是prototype的一个成员,
它默认指向对象的父原型链
如果修改了它就会修改当前对象的父链。。
实例后,它的默认值是指向原型对象的。。。
就好比
var c = new Function;
c.prototype = new (new Function);
这样就给c.prototype的父链指向了(new Function).prototype(prototype是一个对象,所以c.prototype默认的父链是Object.prototype)
但是
如果你在
c.prototype.__proto__ = {};
那么将会把父链转移到{}
*/
alert(Object.__proto__) //Function.prototype  Object和Function都是函数对象所以自然继承了Function.prototype和Object.prototype
alert(Object.prototype.__proto__); //这个是最顶层对象原型,所以没有__proto__可供给继承。。。即没有父链。。。
alert(Function.__proto__); //Function.prototype
alert(Function.prototype.__proto__); //这个是最顶层对象原型即Object.prototype链
//好了介绍完这些特殊的对象就来一般的吧:D
var c = function () {};
alert(c.__proto__); //Function.prototype
c.__proto__.a = "a";
alert(Function.prototype.a); //a
var c = function () {
    this.floor = 3;
};
c.prototype = {
    constructor : c
    , floor : 2
    , __proto__ : {
    //proto修改父链的引用...
        floor : 1
    }
};
Object.prototype.floor = 0; //c.prototype的父链现在是c.prototype.__proto__但是这个是对象所以默认父链是Object.prototype链
var wc = new c;
alert(wc.__proto__ === c.prototype); //实例化后默认给实例加了个__proto__属性并且指向原型链(这东西不让删 - -)
alert(wc.floor); //3
delete wc.floor;
alert(wc.floor); //2
delete c.prototype.floor;
alert(wc.floor); //1
delete c.prototype.__proto__.floor;
alert(wc.floor); // 0
//根据FF2.0.0.11测试function里的function的proto比较扭曲。。。如下。。。
(function () {
    var c = function () {
        this.name = "my C";
    };
    alert(c.__proto__); //理论上讲应该是Function.prototype,但是这里是一个类似c但又不是c的function,它没有复制c.prototype链。
    alert(c.prototype.__proto__ === c.__proto__.prototype);
    //并且它还给c.prototype.__proto__指向了c.__proto__.prototype链,默认应该是Object.prototype链。
})();
//下面是在函数外面的形式
var c = function () {
    this.name = "my C";
};
alert(c.__proto__ === Function.prototype); //true
alert(c.prototype.__proto__ === Object.prototype); //true
//最后来个多层链...:D
Object.prototype.floor = 0;
Object.prototype.toString = function () {
    return this.floor;
};
var a = function () {};
a.prototype.floor = 2;
a.prototype.__proto__ = {
    floor : 1
};
var b = function () {};
b.prototype.floor = 3;
b.prototype.__proto__ = a.prototype;
var c = function () {
    this.floor = 5;
};
c.prototype.floor = 4;
c.prototype.__proto__ = b.prototype;
var wc = new c;
alert(wc); //5
delete wc.floor;
alert(wc); //4
delete wc.__proto__.floor;
alert(wc); //3
delete wc.__proto__.__proto__.floor;
alert(wc); //2
delete wc.__proto__.__proto__.__proto__.floor;
alert(wc); //1
delete wc.__proto__.__proto__.__proto__.__proto__.floor;
alert(wc); //0
delete wc.__proto__.__proto__.__proto__.__proto__.__proto__.floor;
alert(wc); //undefined
</script>

posted on 2008-09-27 14:00  flykye  阅读(303)  评论(0编辑  收藏  举报