日期:2014-05-16  浏览次数:20454 次

关于《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);