Backbone.js'contructor.prototype'和'__proto__'之间的区别?

时间:2016-06-27 06:16:05

标签: javascript backbone.js prototype-chain

有些代码是为了在Backbone中显示继承而实现的。

GrandParent.js:

define([ "require", "jquery", "backbone"], function(require, $, Backbone) {

return Backbone.Model.extend({

    //for method, variable override
    name : "grandFa", //@ WILL BE Overrided
    familyName : "Song",
    age : 99,

    sayThis : function() { //@ WILL BE Overrided
        alert("GrandParent.this : "+this+" "+this.name);
    }

    });

 });

Parent.js:

define([ "require", "jquery", "backbone", "grandParent"], function(require, $, Backbone, GrandParent) {
    return GrandParent.extend({
        //for testing complicated this usage
        age : 50,
        //@Overrided
        name : "father",
        sayThis : function() {
            alert("Parent.this : "+this+" "+this.name);
        }
    });
});

Main.js:

require.config({
paths : {
        jquery : "libs/jquery-2.1.0",
        underscore : "libs/underscore-1.6.0",
        backbone : "libs/backbone-1.1.0",
        grandParent : "1-GrandParent",
        parent : "2-Parent"
    }
});

require(
["jquery","underscore", "backbone","grandParent","parent","child"], function($, _,Backbone, GrandParent, Parent, Child) {
    $(document).ready(function() {
        var grandParent = new GrandParent();
        var parent = new Parent();
        alert(parent.constructor.prototype.name); //=> parent
        alert(parent.__proto__.name); //=> parent   
    });
});

在此代码中,parent.constructor.prototype.nameparent.__proto__.name看起来完全相同。为什么Backbone会使2个字段工作并且看起来完全相同?

constructor.prototype& __proto__

1 个答案:

答案 0 :(得分:1)

  

constructor.prototype& __proto__

__proto__是实际对象,用于解析查找链上的属性和方法。 JavaScript能够实现通过原型完成的继承。可以使用prototype扩展每个内置对象,该__proto__进一步用于创建新的function Foo() { } Foo.constructor.prototype == Foo.__proto__; // returns true ,例如

Foo.prototype == Foo.__proto__;  // returns false;

但是这里发生了什么......

__proto__

Must read on this topic here!

这就是为什么当你发出警报时你得到相同的结果。事情是__proto__并不意味着暴露/扩展它是never recommended。所以你不应该担心他们给出相同的结果。 Backbone可能已经扩展了自定义函数/方法的原型,但是它创建了fc.truncate(oldpos + lineFromFile.length()-1); 作为蓝图的JavaScript。