代码之家  ›  专栏  ›  技术社区  ›  Stradigos

JavaScript“类”没有属性

  •  1
  • Stradigos  · 技术社区  · 9 年前

    当我这样做的时候

    var classTest = Bar(myID);
    classTest.Test();
    

    当使用下面的代码时,它会返回并显示 classTest has no properties 。我好像不识字 classTest.id 任何一个

    不起作用,因为这里的“this”显然指的是Foo,而不是Bar。

    Foo.prototype.Bar=function(id)
    {
        var id = id;
    
        this.Test=function()
        {
            print("test");
        }
    };
    

    这也不起作用。

    Foo.prototype.Bar=function(id)
    {
            var id = id;
    };
    
    Bar.Test=function() 
    {
            print("test");
    };
    

    两者都没有 Bar.prototype.Test=function(id);

    两者都没有 Foo.prototype.Bar.prototype.Test=function(id);

    1 回复  |  直到 9 年前
        1
  •  3
  •   Andreas Louv    9 年前

    JavaScript不像其他OOP语言那样使用类,而是使用评级器原型。

    “类”原型中的任何内容都可用于该“类”的所有实例,即使它是在创建“类”实例之后添加的。

    “类”本身实际上只是一个函数。但当使用“new”运算符调用时,它的行为将类似于大多数其他OOP的Class构造函数。

    在“Class”和构造函数上的每个方法中都会有一个关键字( this )这将是该实例的句柄。

    var Bar = function() {
      // Im the constructor
    }
    Bar.prototype.setName = function(name) {
      // Im a method on the instances of Bar
      // We assing our property `name` with the value from my first argument
      this.name = name;
    }
    Bar.prototype.getName = function(name) {
      return this.name;
    }
    
    var bar = New Bar();
    bar.setName('John');
    console.log(bar.getName()); // John
    

    这可能不会直接回答你的问题,但如果你想得足够久,它可能会最终回答你。


    JavaScript中的继承基于遍历“原型链”。看起来很奇怪,原型可以有原型。尝试访问属性时,将检查原型。如果在该原型中找不到该属性,则将检查该原型的原型,依此类推,直到没有更多的原型。因此,为了创建一个“子类”,从它的“超级类”中继承属性和方法,您必须执行以下操作:

    var Foo = function() {
      // Foo's constructor, remember to call your supers as well:
      Bar.call(this);
    }
    Foo.prototype = Object.create(Bar.prototype);
    Foo.prototype.fooMethod = function() {
      return -1;
    }
    
    var foo = new Foo();
    foo.setName('John');
    foo.getName(); // John
    foo.fooMethod(); // -1
    

    您可以使用我们上面学到的内容在实例中创建实例:

    当我们创建Foo的实例时( foo ),将创建Bar的实例( foo.bar ):

    var Bar = function() {
      // Im the constructor
    }
    Bar.prototype.setName = function(name) {
      // Im a method on the instances of Bar
      // We assing our property `name` with the value from my first argument
      this.name = name;
    }
    Bar.prototype.getName = function(name) {
      return this.name;
    }
    
    var Foo = function() {
        this.bar = new Bar();
    }
    var foo = new Foo();
    
    foo.bar.setName('John');
    console.log(foo.bar.getName()); // John