下面,我在JavaScript中有一个简单的小继承链:

var Base  =(function(){
          function Base(config){
            this.name = function(){
                return config.name;
            }
            this.department = function(){
                return config.department;
            }
        }
        Base.prototype.calculate = function(){
            return this.name().length + this.department().length;
        }
        return Base;
    })();
    var base = new Base({
        name: 'me',
        department: 'this one'
    });
    console.log(base.calculate());
    //inheritance
    var Concrete = (function(){
        Concrete.prototype = Base.prototype;
        function Concrete(config){
            Base.apply(this,arguments);
            this.number = function(){
                return config.number;
            }
        }
        return Concrete;
    })();
    var concrete = new Concrete({
        name: 'concrete',
        department: 'the best',
        number: 3
    });
    console.log(concrete.number()); //3
    console.log(concrete.name()); //concrete


并按预期工作。我很好奇,尽管将方法属性放在对象的原型上有多正确。规范地讲,我知道实例数据应该与类的实例一起使用,而对象实际使用的方法应该在原型上,但是如果属性本身是方法(例如本例中Base中的名称和部门),情况又如何呢?为了使事物保持不变,我宁愿不要让用户在初始化后更改其中一个对象的属性。在这种情况下,使用原型而不是构造函数向对象添加功能是否有意义?

或者仅将属性放在构造函数中是正确的,这样当您执行诸如Base.prototype.whatever之类的操作时,您就可以访问它们?

最佳答案

属性本身就是方法的情况又如何呢?为了使事物保持不变,我宁愿不要让用户在初始化后更改其中一个对象的属性。


我不再将这些“属性”称为“访问器”或“获取器”方法。


  在这种情况下,使用原型而不是构造函数向对象添加功能是否有意义?


是的,如果您指的是类似calculate的功能。如果您是指诸如namedepartmentnumber之类的吸气剂,则需要将它们放置在构造函数中,因为它们需要对config的特权访问。


  规范地说,我知道实例数据应该与类的实例一起使用,并且对象实际使用的方法应该在原型上


实际上有点不同:


实例特定的所有内容(数据,具有不同作用域的访问器方法)都需要进入实例,并且通常在构造函数中进行设置
所有实例之间共享的所有内容(通常是方法,在极少数情况下还包括数据)都应放在原型上。



Concrete.prototype = Base.prototype;



No!改用Concrete.prototype = Object.create(Base.prototype);

关于javascript - 属性应该在原型(prototype)上吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25725139/

10-12 12:34
查看更多