JavaScript&原型

时间:2016-06-10 03:22:21

标签: javascript

我是JavaScript新手。我已经做了很多谷歌搜索,但未能找到我寻求的答案 - 可能是因为我使用了错误的术语。

前几天,我正在阅读有关创建JavaScript组件的基本教程:http://callmenick.com/post/javascript-objects-building-javascript-component-part-2

本教程的一部分涉及一组默认选项,这些选项分配给类型的原型链:

SimpleAlert.prototype.options = {
  wrapper : document.body,
  type : "default",
  message : "Default message."
}

如果用户在构造期间提供SimpleAlert类型,则可以使用不同的参数创建SimpleAlert类型 - 否则使用默认选项。

function SimpleAlert( options ) { this.options = extend( {}, this.options ); // Why? extend( this.options, options ); // start the functionality... } 构造函数如下所示:

extend

function extend( a, b ) { for( var key in b ) { if( b.hasOwnProperty( key ) ) { a[key] = b[key]; } } return a; } 函数定义为:

SimpleAlert

我对这段代码的理解是:

创建新的options对象涉及用户传入自己的{ test : "Testing" }对象。假设我通过options传递extend参数。 this.options函数然后访问options(我相信它是原型的options实例,因为范围中没有定义其他{}变量)并且基本上复制了所有内容共享实例到空this.options对象,然后将其分配给共享的options实例。

然后,用户提供{ test : "Testing" }(在我的情况下extend this.options编辑test共享实例(基本上将我的额外SimpleAlert.prototype.options字段复制到共享实例)

但实际上,似乎共享实例在此示例中不受影响 - 意味着SimpleAlert声明保持不变,以便this.options的每个新实例都可以访问它(这是什么我想要)

但是,在我的实验中,我发现更改 var Animal = function(ovr) { if (arguments.length > 0) { this.options.mode = ovr; } }; Animal.prototype.options = { mode: "Test" }; / I want this to be default for all instances created var test = new Animal("Override"); // set this test obj to use "Overide" console.log(test.options.mode); // outputs Override as expected var again = new Animal(); console.log(again.options.mode); // also outputs Override (I want it to say "Test") 会导致原型值被修改......我确定无论我做错了什么都很容易修复,但我看不到它。这是一个例子:

    > public function hasilCarianPermohonan()
{
    $mukim_id = $_POST['mukim_id'];
    $no_fail = $_POST['no_fail'];
    $pemohon = $_POST['pemohon'];
    $status = $_POST['status'];

    if($pemohon == NULL)
    {
        $pemohon = "%";
    } else if($no_fail == NULL)
    {
        $no_fail = "%";
    }

    $query = $this->db->query("SELECT * FROM permohonan pr INNER JOIN    
status_permohonan st ON pr.no_fail = st.no_fail WHERE pr.mukim_id LIKE  '$mukim_id' AND st.status LIKE '$status' AND (pr.no_fail LIKE '$no_fail' OR pr.pemohon LIKE '$pemohon') ORDER BY pr.app_id ASC");

    if($query->num_rows() > 0)
    {
        return $query->result();
    } else {
        return false;
    }

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

正如您在代码中已经建议的那样,它错过了" copy"操作,以便您修改原型上的共享对象。

var Animal = function(ovr) {
    if (arguments.length > 0) {
        // Copy whatever is on this.options to a blank object,
        // then assign this.options to be that newly copied object, so
        // the prototype object is masked by the instance object.
        this.options = Object.assign({}, this.options);
        this.options.mode = ovr;
    }
};

这可能有助于理解实例属性"掩盖"原型:

var Foo = function() {
    console.log('a', this.x);
    this.x = 100;
    console.log('b', this.x);
    delete this.x;
    console.log('c', this.x);
};

Foo.prototype.x = 1;

new Foo();