没有调用Javascript prototype.constructor

时间:2014-02-01 18:44:27

标签: javascript jquery oop

我是Javascript Object Oriented Programming的新手。我需要写一个JS class,可以是inherited。完整的课程可以是inherited。除了documentready之外,它也会被调用。

我正在尝试以下方式:

alert('reached');
var Hello = new VeerWidget();

function VeerWidget(){}

VeerWidget.prototype.constructor = function()
{
    $(document).ready(function(){
        alert('called');
    });
}

我在xyz.js

中有上述代码

我期待的是:一旦页面加载,popup 到达,然后popup 调用。< / p>

但这不起作用。调用到达popup。但是,不会调用名为的

然而,当我这样做的时候:

alert('reached');
var Hello = new VeerWidget();

function VeerWidget()
{
    $(document).ready(function(){
        alert('called');
    });
}

一切都很顺利。但我需要继承VeerWidget。怎么做。?

2 个答案:

答案 0 :(得分:4)

你遇到的问题是这条线没有按照你的想法行事:

VeerWidget.prototype.constructor = function()

它的作用是为所有实例都可见的属性设置一个值。

实例的构造函数实际上是VeerWidget函数,无论你做什么都不会改变,所以你的代码应该是这样的:

alert('reached');
var Hello = new VeerWidget();

function VeerWidget(){
    $(document).ready(function(){
        alert('called');
    });
}

至于继承,我不完全确定你追求的是什么,但它看起来像这样:

function InheritingWidget() {
    VeerWidget.call(this);
}

InheritingWidget.prototype = Object.create(VeerWidget.prototype);
InheritingWidget.prototype.constructor = InheritingWidget;

var inheritingHello = new InheritingWidget();

答案 1 :(得分:1)

只需在主构造函数的末尾添加此行,即可执行原型构造函数:

if(typeof this.__proto__.constructor === 'function') this.__proto__.constructor();

最终结果将是:

VeerWidget.prototype.constructor = function(parent) {
    var message = parent.getMessage();
    $(document).ready(function(){
       alert(message);
    });
}

alert('reached');
var Hello = new VeerWidget();

function VeerWidget()
{
    if(typeof this.__proto__.constructor === 'function') this.__proto__.constructor();
}

注意:您可以传递父函数来访问它的方法如下:

VeerWidget.prototype.constructor = function(parent) {
    var message = parent.getMessage();
    $(document).ready(function(){
       alert(message);
    });
}

function VeerWidget()
{
    this.getMessage = function() {return 'called';};
    if(typeof this.__proto__.constructor === 'function') this.__proto__.constructor(this);
}