当前位置: 首页 > 面试题库 >

如何在JS Revealing原型模式中实现继承?

宗啸
2023-03-14
问题内容

如何继承/扩展使用“显示原型”模式的类?有没有办法制作private变量和函数protected

基础对象示例:

myNameSpace.Person = function() {

    this.name= "";
    this.id = 0;

};

myNameSpace.Person.prototype = function(){
    var foo = function(){
        //sample private function
    };
    var loadFromJSON = function (p_jsonObject) {
       ...
    };
    var toJSON = function () {
       ...
    };
    var clone = function (p_other) {
       ...
    };

    return {
        loadFromJSON : loadFromJSON,
        toJSON: toJSON,
        clone: clone
    };
}();

问题答案:

JavaScript中没有受保护的变量/属性。但是,当您在同一范围内声明继承类时,可以重用“私有”变量,当私有变量只是原型的“隐藏实用程序”时,这似乎是可能的。

MyNamespace.Person = function Person(params) {
    // private variables and functions, individual for each Person instance
    var anything, id;
    function execute_something() {}

    // public properties:
    this.name = "";
    this.getId = function getId(){
        // called a "privileged function", because it has access to private variables
    }
}
MyNamespace.American = function(params) {
    MyNamespace.Person.call(this, params); // inherit name and getId()
}

(function() { // new scope for
    // hidden utility functions and other private things
    function foo() { }
    function helpJSON() { }
    function fromJSON() { }
    var bar;

    (function(personProto) { // new scope for prototype module (not explicitly needed)
        // "private" /static/ variables (and functions, if you want them private)
        var personCount = 0;

        personProto.clone = function clone() {
            return this.constructor(myself); // or something
        };
        personProto.toJSON = function toJSON() {
            // use of helpJSON()
        };
        personProto.fromJSON = fromJSON; // direct use
    })(MyNamespace.Person.prototype);

    (function(amiProto) {
        // just the same as above, if needed
        amiProto.special = function() {
            // use foo() and co
        };
    })( MyNamespace.American.prototype = Object.create(MyNamespace.Person.prototype) );
})();

这是JavaScript的继承方式,这意味着American的原型从Person的原型自动继承了clone(),toJSON()和fromJSON()函数。当然可以改写了。功能

new MyNamespace.American() instanceof MyNamespace.Person; // true

当然,如果不需要,并希望使用类似模块的方式,则可以重用实用程序功能,即仅复制它们:

(function() {
    // hidden utility functions and other private things
    var bar;
    var personCount;
    function foo() { }
    function helpJSON() { }
    function fromJSON() { }
    function clone() {
        return this.constructor(myself); // or something
    }
    function toJSON() { }

    (function(personProto) { // new scope, not really needed
        // private variables are useless in here
        personProto.clone = clone;
        personProto.toJSON = toJSON;
        personProto.fromJSON = fromJSON;
    })(MyNamespace.Person.prototype);

    (function(amiProto) { // new scope, not really needed
        // copied from personProto
        amiProto.clone = clone;
        amiProto.toJSON = toJSON;
        amiProto.fromJSON = fromJSON;
        // and now the differences
        amiProto.special = function() {
            // use foo() and co
        };
    })(MyNamespace.American.prototype);
})();


 类似资料:
  • 本文向大家介绍Javascript中类式继承和原型式继承的实现方法和区别之处,包括了Javascript中类式继承和原型式继承的实现方法和区别之处的使用技巧和注意事项,需要的朋友参考一下 在所有面向对象的编程中,继承是一个重要的话题。一般说来,在设计类的时候,我们希望能减少重复性的代码,并且尽量弱化对象间的耦合(让一个类继承另一个类可能会导致二者产生强耦合)。关于“解耦”是程序设计中另一个重要的话

  • 我有一个通用接口处理程序 我可以有n个这个接口的实现。假设我现在有以下两个实现。一个处理字符串对象,另一个处理日期 我想写一个工厂,它将根据类类型返回处理程序实例。比如: 我在这个工厂里遇到了以下错误: 类型不匹配:无法从转换为

  • 这里我们只介绍继承、原型的基本概念和其常见使用方式。要完整理解继承,需要读者自行补充阅读面向对象编程的发展历史和一些核心思想。简而言之,继承是为了更好的代码或接口复用。 举个例子,如果我们要在界面上构建若干个面板组件,每个面板包含不同的内容和元素,但要求每个面板都可以被隐藏或显示、漂浮或定位,那么最原始的方法是在每个面板对象中添加show/hide/float/dock方法。 这样就存在大量的代码

  • 嗨,我是Kotlin世界的新手。我喜欢到目前为止所看到的,并开始考虑将我们在应用程序中使用的一些库从Java转换为Kotlin。 第二次更新:问题是如何用Kotlin中的一些参数为一个简单的pojo编写一个构建器设计模式?下面的代码是我的尝试,方法是编写java代码,然后使用eclipse-kotlin-plugin转换为Kotlin。

  • 问题内容: 我有两个班和。我有一个私有变量,可以通过setter和getter方法访问。我就是继承类用。 现在我可以更改using 的值。我想限制该选项。我希望它使其成为只读值。请协助我。 问题答案: 一种选择是从类中 删除 方法: 编辑: 为什么要这样做? 如果从继承,它应该能够执行与相同的动作。否则,继承的目的是什么?如果您仍然认为应该能够修改值而不能修改值,那么您的设计可能是错误的。您可以尝

  • 主要内容:介绍,实现,Shape.java,Rectangle.java,Square.java,Circle.java,ShapeCache.java,PrototypePatternDemo.java原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式之一。 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的