相关疑难解决方法(0)

JavaScript .prototype如何工作?

我不是那种动态编程语言,但是我写了很多JavaScript代码.我从来没有真正了解这个基于原型的编程,有没有人知道这是如何工作的?

var obj = new Object();
obj.prototype.test = function() { alert('Hello?'); };
var obj2 = new obj();
obj2.test();
Run Code Online (Sandbox Code Playgroud)

我记得很久以前我和人们进行了很多讨论(我不确定我在做什么)但是据我所知,没有一个类的概念.它只是一个对象,这些对象的实例是原始的克隆,对吧?

但是JavaScript中这个".prototype"属性的确切目的是什么?它与实例化对象有什么关系?

更新:正确的方式

var obj = new Object(); // not a functional object
obj.prototype.test = function() { alert('Hello?'); }; // this is wrong!

function MyObject() {} // a first class functional object
MyObject.prototype.test = function() { alert('OK'); } // OK
Run Code Online (Sandbox Code Playgroud)

这些幻灯片也非常有帮助.

javascript dynamic-languages prototype-oriented

1988
推荐指数
21
解决办法
49万
查看次数

原型继承 - 写作

所以我有这两个例子,来自javascript.info:

例1:

var animal = {
  eat: function() {
    alert( "I'm full" )
    this.full = true
  }
}

var rabbit = {
  jump: function() { /* something */ }
}

rabbit.__proto__ = animal 

rabbit.eat() 
Run Code Online (Sandbox Code Playgroud)

例2:

function Hamster() {  }
Hamster.prototype = {
  food: [],
  found: function(something) {
    this.food.push(something)
  }
}

// Create two speedy and lazy hamsters, then feed the first one
speedy = new Hamster()
lazy = new Hamster()

speedy.found("apple")
speedy.found("orange")

alert(speedy.food.length) // 2
alert(lazy.food.length) // 2 (!??)
Run Code Online (Sandbox Code Playgroud)

从示例2开始:当代码到达时 …

javascript inheritance prototype

130
推荐指数
2
解决办法
1万
查看次数

JavaScript中的多重继承/原型

我已经到了需要在JavaScript中进行某种基本的多重继承的地步.(我不是来讨论这是否是个好主意,所以请将这些意见保留给自己.)

我只是想知道是否有人尝试过任何(或没有)成功,以及他们如何去做.

简而言之,我真正需要的是能够拥有一个能够从多个原型继承属性的对象(即每个原型可以拥有自己的正确链),但是在给定的优先顺序中(它将会搜索链以便第一个定义).

为了证明这在理论上是如何可能的,可以通过将辅助链附加到主链的末端来实现,但这会影响任何先前原型的所有实例,而这不是我想要的.

思考?

javascript prototype multiple-inheritance

126
推荐指数
5
解决办法
6万
查看次数

JavaScript扩展类

我有一个基类:

function Monster() {
  this.health = 100;
}

Monster.prototype.growl = function() {
  console.log("Grr!");
}
Run Code Online (Sandbox Code Playgroud)

我想扩展并创建另一个类:

function Monkey extends Monster() {
  this.bananaCount = 5;
}

Monkey.prototype.eatBanana {
  this.bananaCount--;
  this.health++; //Accessing variable from parent class monster
  this.growl();  //Accessing function from parent class monster
}
Run Code Online (Sandbox Code Playgroud)

我做了很多研究,似乎有很多复杂的解决方案在JavaScript中这样做.在JS中实现这一目标的最简单,最可靠的方法是什么?

javascript oop inheritance object ecmascript-6

71
推荐指数
4
解决办法
9万
查看次数

什么是好的JavaScript OOP资源?

JavaScript是一种轻量级且功能强大的语言,但它经常被误解并且难以学习(特别是关于其面向对象的编程).

学习JavaScript OOP有哪些好的材料(博客,截屏和书籍)?主题可以是任何东西,但我们暂时不包括浏览器,AJAX和库.

您是如何在JavaScript中学习函数式编程,闭包,对象,继承和设计模式的?我个人希望看到更多的代码示例,因为我上面提到的一些书籍使示例保持最小化.

(编辑:由于这篇文章现在是社区的努力,请帮助维护和开发以下资源列表!)

图书

影片

在堆栈溢出

其他

javascript oop closures

50
推荐指数
1
解决办法
8198
查看次数

Javascript继承理念(第2部分)

好吧,我第一次试图解释我在做什么的尝试失败了.我基本上复制了Crockford的Object.create(),除了私有变量.

如果你看看这里接受的答案如何从javascript中继承一个类?,你会看到Object.create是最后一个模式,我认为它更符合Javascript(对象beget对象)的原型性质,而不是模仿经典继承(类beget对象).

如果你看一下维基百科关于原型编程的文章(http://en.wikipedia.org/wiki/Prototype-based_programming),你可以看到更多我的意思.

但是,Object.create()的缺点是不支持私有成员.这就是我的建议:

Function.prototype.from = function(obj) {
    function F() {this.parent = Object(obj);}
    F.prototype = obj;
    var out = new F();
    this.apply(out);
    return out;
};
Run Code Online (Sandbox Code Playgroud)

然后,您可以这样创建对象:

// Create an object
var a = function() {
    var private_property = 'blue';
    this.public_property = 7;

    this.public_method = function() {
        alert(this.public_property + ' ' + private_property);
    }
}.from(null); // .from() works too, but .from(null) is more revealing


// Create a new object using 'a' as the prototype
var b = …
Run Code Online (Sandbox Code Playgroud)

javascript inheritance prototype

8
推荐指数
1
解决办法
388
查看次数

什么是一个很好的简约Javascript继承方法?

我正在重写一个JavaScript项目,我希望能够使用面向对象的方法来组织当前代码的混乱.主要关注的是这个JavaScript应该作为第三方网站内的一个小部件运行,我不能让它与其他网站可能使用的其他JavaScript库冲突.

所以我正在寻找一种在JavaScript中编写"类类"继承的方法,它具有以下要求:

  1. 没有外部库或与外部库冲突的东西(阻止从外部库复制和粘贴).
  2. 简约 - 我不希望支持代码比几行代码更大,我不希望开发人员每次定义新的类或方法时都需要大量的样板.
  3. 应该允许动态扩展父对象,以便子对象看到更改(原型).
  4. 应该允许构造函数链接.
  5. 应该允许super类型调用.
  6. 还应该感受到JavaScript-ish.

最初我尝试使用简单的原型链接:

function Shape(x,y) {
  this.x = x;
  this.y = y;

  this.draw = function() {
    throw new Error("Arbitrary shapes cannot be drawn");
  }
}

function Square(x,y,side) {
  this.x = x;
  this.y = y;
  this.side = side;

  this.draw = function() {
    gotoXY(this.x,this.y); lineTo(this.x+this.side, this.y); ...
  }
}
Square.prototype = new Shape();
Run Code Online (Sandbox Code Playgroud)

这解决了需求1,2和6,但id不允许超级调用(新函数覆盖父函数),构造函数链接和动态扩展父级不会为子类提供新方法.

欢迎任何建议.

javascript oop inheritance

6
推荐指数
1
解决办法
1831
查看次数

Javascript中的类继承

我想知道如何在JavaScript中模拟类继承.我知道类不适用于JavaScript,我们使用的方式是通过Prototype对象创建对象和继承事物的函数.

例如,如何将此结构转换为JavaScript:

public class Mankind {
    public string name;
    public string lastname;
}

public class Person: Mankind {
    public void Run(string fromWhat) {
        //write the run logic
    }
}
Run Code Online (Sandbox Code Playgroud)

JavaScript中这段代码的等价物是什么.

编辑:

我还发现了另一个链接,Douglas Crockford解释了CMS的不同继承模型:JavaScript中的经典继承.

希望它也有助于其他人.

javascript inheritance class

6
推荐指数
1
解决办法
731
查看次数