相关疑难解决方法(0)

如何在类声明上实现伪经典继承?

注意:

正如答案所说,由于问题和我的评论中描述的一些问题,问题中提出的代码并没有真正实现继承(否则它会成为答案而不是问题......).它可以像预期的那样继承(甚至不是原型).


  • 摘要

    简而言之,使它类似于我们编写一般的OO语言而不是javascript,但保持继承是正确的.

  • 故事

    的Object.create是实现原型继承的好方法,但它是一个有点混乱,以一个类型的大脑和新的球迷.

    我们可以通过各种方式编写javascript代码,就像我们使用伪经典模式编写其他OO语言一样.因为它是经典的,我们必须正确处理javascript的底层原型继承.

    我想要找到的是一种可以在类声明上实现伪古典继承的方法.演示代码放在帖子的后面,它按预期工作,但是,有一些烦人的事情:

    1. 我无法摆脱return类声明或继承不起作用.

    2. 除了传入this类声明以使返回的闭包知道是什么,我没办法this.

    3. 我也想摆脱function (instance, _super) {,但还没有一个好主意.

    4. 不继承类的静态(自己的属性).

    解决方案比现有框架更多的是一些语法糖,一个好的模式是适用的.


_extends函数:

function _extends(baseType) {
    return function (definition) {
        var caller=arguments.callee.caller;
        var instance=this;

        if(!(instance instanceof baseType)) {
            (caller.prototype=new baseType()).constructor=caller;
            instance=new caller();
        }

        var _super=function () {
            baseType.apply(instance, arguments);
        };

        definition(instance, _super);
        return instance;
    };
}
Run Code Online (Sandbox Code Playgroud)

Abc类:

function Abc(key, …
Run Code Online (Sandbox Code Playgroud)

javascript inheritance types prototype

11
推荐指数
1
解决办法
3431
查看次数

“类不是对象”是什么意思?

来自 GoF 的书:

原型对于像 C++ 这样的静态语言特别有用,其中类不是对象,并且在运行时很少或没有类型信息可用。在像 Smalltalk 或 Objective C 这样的语言中,它提供相当于原型(即类对象)以创建每个类的实例的内容并不重要。这种模式内置于基于原型的语言中,如 Self [US87],其中所有对象的创建都是通过克隆原型进行的。

“类不是对象”是什么意思?

不总是这样吗?

一个类是一个对象是什么意思?

c++ oop design-patterns prototype

7
推荐指数
2
解决办法
194
查看次数

如何在不在子类的所有实例之间共享超类的相同实例的情况下在JavaScript中进行继承?

我注意到每个关于如何进行JavaScript继承的教程都是这样做的:

SubClass.prototype = new SuperClass();
Run Code Online (Sandbox Code Playgroud)

但是这将创建超类的单个实例并在子类的所有实例之间共享它.

问题是我想将参数传递给超类构造函数,该构造函数源自传递给子类的参数.

在Java中,这将是这样做的:

class SubClass extends SuperClass {
  public SubClass(String s) {
    super(s);
  }
}
Run Code Online (Sandbox Code Playgroud)

我尝试过这样的事情:

function SubClass(args) {
  this.constructor.prototype = new SuperClass(args);
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用.那么在JavaScript中有没有办法做到这一点?

javascript prototype-oriented prototype-programming

6
推荐指数
2
解决办法
1754
查看次数

为什么要在函数及其原型上设置属性?

我试图理解JavaScript的OOP模型,所以我正在阅读这篇文章:https: //developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript

以下代码很有趣:

function Person(gender) {
    this.gender = gender;
    alert('Person instantiated');
}

Person.prototype.gender = '';
var person1 = new Person('Male');
var person2 = new Person('Female');
//display the person1 gender
alert('person1 is a ' + person1.gender); // person1 is a Male
Run Code Online (Sandbox Code Playgroud)

有趣而且不清楚的是这一行:

Person.prototype.gender = '';
Run Code Online (Sandbox Code Playgroud)

我不明白所以我用该行测试了代码,没有它.

代码在两种情况下都能正常工作.

所以我的问题是:

为什么作者添加该行?

javascript oop prototype

5
推荐指数
1
解决办法
92
查看次数

在javascript中的类定义中添加原型

阅读可以使用哪些技术在JavaScript中定义一个类,以及它们的权衡取舍是什么?在stackoverflow上我明白我可以通过定义一个类

方法1:

function Person(name, gender){
   this.name = name;
   this.gender = gender;
}
Run Code Online (Sandbox Code Playgroud)

并在原型中添加函数,以避免每次实例化时重新创建成员函数.喜欢

Person.prototype.speak = function(){
   alert("my name is" + this.name);
}
Run Code Online (Sandbox Code Playgroud)

并通过创建其实例

var person = new Person("Bob", "M"); 
Run Code Online (Sandbox Code Playgroud)

我认为使用新的关键字就可以创建相同的对象

方法2:

var Person = function (name, gender) {

    return {name:name, gender:gender}; 

}

person  = Person("Bob", "M");
Run Code Online (Sandbox Code Playgroud)

第二种方法是否完成了第一种方法完成相同的操作?如果是这样的话,我将如何在第二种方法中通过原型模拟添加函数(正如我们在方法1中所说的那样)

javascript prototype class object

0
推荐指数
1
解决办法
146
查看次数