0

我想在构造函数上实现一个扩展方法,并用它来初始化一个实例,比如:

var view_instance = View.extend()

所以我尝试了这个:

define(function (require, exports, module) {

    function View(size, color) {
        this.size = size;
        this.color = color;
    };

    View.prototype = {
        show: function () {
            console.log("This is view show");
        }
    }

    View.extend = function (props) {
        var tmp = new this("12", "red");
        console.log(this);
            console.log(tmp instanceof this) //true
        console.log(tmp.prototype); //undefined!
        return tmp
    }

    return View;
})

在上面的extend方法中,我通过 初始化了一个实例new this(),但是我无法记录它的原型,我检查了this它是否正确。

那么我的代码有什么问题?为什么原型会消失?我怎样才能做到正确?

4

3 回答 3

1

tmp.constructor.prototype是你想要的。o.__proto__只是一个快捷方式o.constructor.prototype它是非标准的

[编辑]

你可以在这个问题中看到这个数字。它表明它Foo.prototype.constructor指向Foo它自己。但是,由于您使用 line 覆盖构造函数的原型,因此View.prototype = {...}View.prototype.constructor代替function Object() { [native code] }View本身。因此,更准确的方法是直接将属性分配给原始原型或使用constructor手动设置的属性覆盖它:

// Assign properties to the original prototype to prevent overwriting the `constructor` properties.
View.prototype.show = function() {};

// Or set the constructor manually.
View.prototype = {
  show: function() {},
  constructor: View
};
于 2013-07-26T02:04:06.967 回答
1

你的代码没有问题。它做它应该做的事情。该prototype属性仅存在于函数上。

当您在函数调用之前使用new关键字 JavaScript 时,会创建一个继承自prototype构造函数的对象。

简单来说:

function F() {}                                        // we have a constructor
var o = new F;                                         // we create an instance
console.log(Object.getPrototypeOf(o) === F.prototype); // o inherits from
                                                       // F.prototype

JavaScript 中的对象通过委托从其他对象继承。这意味着假设我们尝试访问o我们在上面看到的对象的属性:

  1. JavaScript 将首先尝试在o自身上查找属性。
  2. 如果它在上面找不到该属性,o那么它将尝试在上面找到它Object.getPrototypeOf(o)(或者更简洁地说o.__proto__)。的原型oF.prototype
  3. 如果它在 上找不到该属性,F.prototype那么它将尝试在F.prototype.__proto__which is上找到它Object.prototype
  4. 如果它在上面找不到该属性,Object.prototype那么它将放弃,因为Object.prototype.__proto__is null

简而言之,这就是您的原型继承。

您的代码记录的原因undefinedtmp.prototype因为tmp没有任何名为prototype. 只有函数才有prototype属性。试试这个:

console.log(Object.getPrototypeOf(tmp));

以上与以下相同。但是__proto__,对象的属性已被弃用。需要您自担风险使用它:

console.log(tmp.__proto__);

如果您想了解有关继承的更多信息,请阅读以下文章:

  1. 阿迪特 M 沙阿 | 为什么原型继承很重要
  2. JavaScript继承和构造函数属性 - 代码日志
于 2013-07-26T02:32:35.523 回答
0

prototype属性属于构造函数。__proto__这些实例具有指向同一对象的非标准属性。所以:

console.log(tmp.__proto__);

或者:

console.log(Object.getPrototypeOf(tmp));
于 2013-07-26T02:01:55.117 回答