2013-01-31 10 views
8

Sadece javascript edindim ve nesneye yönelik davranışı ile şaşırdım. Sadece x, y üyeleri ile bir sınıf Point2D oluşturmak ve x, y, z üyeleri ile bir Point3D sınıfla uzatmaya çalışıyordum.Javascript'te "superclass" yapıcıyı çağır

class Point2D 
{ 
    int x, y; 
    public Point2D(int x, int y) { this.x = x; this.y = y; } 
} 
class Point3D : Point2D 
{ 
    int z; 
    public Point3D(int x, int y, int z) : base(x, y) { this.z = z; } 
} 

Ben bir sürü şey okudum ama gerçekten aradığım şeyi bulmak için görünmüyor: Ne elde etmek çalışıyorum davranış gibi en C# bunu diyelim bir şeydir. Ben bugüne kadar kadar geldim ne: Açıkçası yanlış

function Point2D(x, y) { this.x = x; this.y = y; } 
Point2D.prototype.constructor = Point2D; 
function Point3D(x, y, z) { Point2D.prototype.constructor.call(this); this.z = z; } 
Point3D.prototype = new A(); // see latter explanation 
Point3D.prototype.constructor = B; 
var p = new Point3D(10, 20, 30); 

.

Şimdi, ben Point3D.prototype = new A(x, y) gibi bir şey yapması gerektiğini biliyorum ama sabitx, y koordinatları ve değişken z ile bir prototip oluşturmak istemiyoruz. Çok basit olmalı, ama bunu anlamıyorum, süper sınıf kurucusunu aramak gibi görünmüyor ya da düzgün davranmasını sağlayamıyorum.

cevap

13

JavaScript'in prototip kalıtımı, aradığınız polimorfik kurucuların türlerini gerçekleştirmeniz için birkaç farklı esnek yol sağlar. senin özel örnekte, böyle bir şey istiyorum:

function Point2D(x, y) { 
    this.x = x; 
    this.y = y; 
} 

function Point3D(x, y, z) { 
    Point2D.call(this, x, y); 
    this.z = z; 
} 

açıkça prototype üzerinde constructor ayarı ile Fussing burada kesinlikle gerekli değildir. (Sadece prototip oluşturduğunuzda sadece "bir kerede" - örneğin, bir nesne ile oluşturduğunuzda gereklidir.)

Nesne yönelimli JavaScript'in ayrıntılı bir açıklaması için Nicholas Zakas 'Nesne Yönelimli Programlama JavaScript (ebook) veya diğer kitaplarında prototip ve devralma tartışması, Web Geliştiricileri için Profesyonel JavaScript.

+0

Çok teşekkür ederim, deliriyordum ve o kadar kolaydı! Kesinlikle bu kitapların en az birine bir okuma yapacağım. – Cancer