首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

关于《JavaScript语言精粹》中的原型继承有关问题

2013-03-21 
关于《JavaScript语言精粹》中的原型继承问题本帖最后由 mccissb 于 2013-03-15 21:19:16 编辑道格拉斯的《Ja

关于《JavaScript语言精粹》中的原型继承问题
本帖最后由 mccissb 于 2013-03-15 21:19:16 编辑 道格拉斯的《JavaScript语言精粹》中定义了一个Object.beget方法(修订版中为Object.create方法),代码如下:


if (typeof Object.beget!== 'function') {
    Object.beget= function(o) {
        var F = function() {};
        F.prototype = o;
        return new F();
    };
}


我不懂的地方是,为什么要定义一个函数F,并通过new F()来生成新对象?可不可以改成下面这样?

if (typeof Object.beget!== 'function') {
    Object.beget= function(o) {
        var newObject = {};
        newObject .prototype = o;
        return newObject ;
    };
}
javascript
[解决办法]
var stooge = {};
stooge['first-name'] = 'Jerome';
stooge['middle-name'] = 'Lester';
var another_stooge = Object.beget(stooge);

第一种写法,假如要得到first-name的值,用another_stooge['first-name'];

第二种写法,假如要得到first-name的值,用another_stooge.prototype['first-name'];
[解决办法]
经过一个上午的查找和测试,应该和原型链有关。
通过楼主的第一个函数既 new F() 创建的对象,不存在 prototype 属性,而存在 __proto__ 属性;
通过楼主所写的第二个函数创建的对象,存在 prototype 属性,而不存在 __proto__ 属性;

仍在研究中...

以下是我的测试代码:

//两种函数
Object.cr= function(o) {
    var F = function() {};
    F.prototype = o;
    return new F();
};
Object.bt= function(o) {
    var newObject = {};
    newObject .prototype = o;
    return newObject ;
};

//创建原始对象
var o = { x:"o_x", y:"o_y" };

//通过三种不同方法创建新对象
var o_de = o; 
var o_cr = Object.cr(o);
var o_bt = Object.bt(o);

//改写原始对象属性
o.x = "o.x2";
o_bt.x= "o_bt";
o_cr.x= "o_cr";

//显示对象的属性和方法
console.dir(o_de);
console.dir(o_cr);
console.dir(o_bt);

热点排行