惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
罗磊的独立博客
The GitHub Blog
The GitHub Blog
V
V2EX
Last Week in AI
Last Week in AI
博客园 - 聂微东
MyScale Blog
MyScale Blog
美团技术团队
L
LangChain Blog
博客园 - Franky
腾讯CDC
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园_首页
S
SegmentFault 最新的问题
爱范儿
爱范儿
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Stack Overflow Blog
Stack Overflow Blog
量子位
小众软件
小众软件
宝玉的分享
宝玉的分享
J
Java Code Geeks
Google DeepMind News
Google DeepMind News
D
Docker
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报

博客园 - flykye

FLEX内存优化技巧集合 在FF下用CSS模拟实现text-overflow:ellipsis字符截取省略号效果 - flykye - 博客园 FireBug的控制台管理 推介的CSS书写顺序(转) CSS实现未知高度图文混合垂直居中 JavaScript与ActionScript通讯 JavaScript继承之闭包原型继承法 JavaScript在内层循环中断外层循环 我的Blog不含三聚氰胺 傲游越来越差了 IE下LI的3pxBUG IE下使用CSS截取文字 调试JavaScript,不再用alert了 (二) 调试JavaScript,不再用alert了 firefox的css私有属性 scrollLeft,scrollWidth,clientWidth,offsetWidth之完全详解 页面优化技巧 javascript拖动小例子 IE7 IE6 FF 简单的CSS Hack
Firefox下的__proto__
flykye · 2008-09-27 · via 博客园 - flykye
 

<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>