muxrwc

厕所专栏

原创 原型父链__proto__对象的介绍。。。收藏

新一篇: 判断两个串长串是否包含短串的每一个字符 | 旧一篇: src里js和iframe的巧妙应用。。。

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

发表于 @ 2007年12月29日 09:45:00|评论(loading...)|编辑

新一篇: 判断两个串长串是否包含短串的每一个字符 | 旧一篇: src里js和iframe的巧妙应用。。。

评论:没有评论。

发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © muxrwc