我不是那种动态编程语言,但是我写了很多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.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中进行某种基本的多重继承的地步.(我不是来讨论这是否是个好主意,所以请将这些意见保留给自己.)
我只是想知道是否有人尝试过任何(或没有)成功,以及他们如何去做.
简而言之,我真正需要的是能够拥有一个能够从多个原型链继承属性的对象(即每个原型可以拥有自己的正确链),但是在给定的优先顺序中(它将会搜索链以便第一个定义).
为了证明这在理论上是如何可能的,可以通过将辅助链附加到主链的末端来实现,但这会影响任何先前原型的所有实例,而这不是我想要的.
思考?
我有一个基类:
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是一种轻量级且功能强大的语言,但它经常被误解并且难以学习(特别是关于其面向对象的编程).
学习JavaScript OOP有哪些好的材料(博客,截屏和书籍)?主题可以是任何东西,但我们暂时不包括浏览器,AJAX和库.
您是如何在JavaScript中学习函数式编程,闭包,对象,继承和设计模式的?我个人希望看到更多的代码示例,因为我上面提到的一些书籍使示例保持最小化.
(编辑:由于这篇文章现在是社区的努力,请帮助维护和开发以下资源列表!)
图书
影片
在堆栈溢出
其他
好吧,我第一次试图解释我在做什么的尝试失败了.我基本上复制了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项目,我希望能够使用面向对象的方法来组织当前代码的混乱.主要关注的是这个JavaScript应该作为第三方网站内的一个小部件运行,我不能让它与其他网站可能使用的其他JavaScript库冲突.
所以我正在寻找一种在JavaScript中编写"类类"继承的方法,它具有以下要求:
super类型调用.最初我尝试使用简单的原型链接:
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中模拟类继承.我知道类不适用于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 ×8
inheritance ×5
oop ×3
prototype ×3
class ×1
closures ×1
ecmascript-6 ×1
object ×1