原型父链__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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值