Javascript Наследование аргументов и функций - PullRequest
2 голосов
/ 13 марта 2012

У меня есть объект:

function Shape(color, position, coordinates){
    this.color = color;
    this.position = position;
    this.coordinates = coordinates;
    this.shrink = function(){
        reduce(coordinates);
    };
};

И один из множества объектов с отношением 'is' к предыдущему объекту.

function Sphere(color, position, coordinates, radius){
    this.radius = radius;
    this.role = function(){
        move(coordinates);
    };
};

И отдельная функция Draw, которая рисуетформы

function draw(shape){
    moveTo(shape.position);
    setColor(shape.color);
    sketch(shape.coordinates);
}; 

Я знаю, что я должен попытаться использовать композицию, где это возможно, но в некоторых случаях, таких как приведенная выше, наследование является гораздо более подходящей моделью.

Без каркасов и так просто, каквозможно, как я мог бы использовать наследование прототипа или любую другую форму для наследования функциональности и атрибутов формы, поэтому мне не нужно переопределять их для каждого создаваемого мной типа фигуры, и я могу передавать аргументы в конструктор объекта-наследника, чтобы онипередан объекту, унаследованному от.

РЕДАКТИРОВАТЬ

Я искал посты с похожими заголовками, и ни один из них не предоставил примеров относительно моей конкретной ситуации, передав аргументы в конструкторе инаследование переменных и функций.Кроме того, я нахожу, что ответ по этому предмету имеет тенденцию представлять несколько вариантов, и я искал более точный ответ на стандартный подход (в качестве примера)

В отношении так называемого окончательного ответа Выполнение наследованияв JavaScript я обнаружил, что если бы я определил все свои атрибуты, как описано в функциях прототипа, мой скрипт был бы беспорядком, а также не представлял, что делать с аргументами, передаваемыми конструктору.

Ответы [ 2 ]

1 голос
/ 13 марта 2012

Я обычно нахожу, что паразитарное наследование является самым простым вариантом в JavaScript:

function Sphere(color, position, coordinates, radius){
    var shape = new Shape(color, position, coordinates);
    shape.radius = radius;
    shape.role = function(){
        move(coordinates);
    };
    return shape;
};

Большим недостатком является то, что вы не можете использовать цепочку прототипов - присоединение методов к Sphere.prototype не будетсделать их доступными для новых Sphere экземпляров.

1 голос
/ 13 марта 2012

Javascript не имеет никакой нативной конструкции для достижения этой цели.Тем не менее, есть служебные библиотеки, которые помогут вам достичь этого.

Если вы заинтересованы в этом, взгляните на базовую библиотеку Дина Эдварда:

http://dean.edwards.name/weblog/2006/03/base/

Вы, вероятно, можете использовать это как есть, чтобы достичь того, что выхочу.В любом случае, я могу порекомендовать каждому программисту javascript прочитать этот код и попытаться понять, как он работает - это сделает вас лучшим программистом.

Очень простое решение, которое вообще не зависит от наследования иТакже решается проблема передачи аргументов, заключающаяся в использовании объектных литералов в качестве аргументов.Чтобы назначить вам, просто скопируйте все поля из литерала объекта следующим образом:

//copy instance variables from source to target 
function copyInstanceVars(source, target){
    var p,v;
    for (p in source){
        if (source.hasOwnProperty(p)) {
            v = source[p];
            target[p] = v;
        }
    }
    return target;
}

//Shape, base class.
var Shape;
(Shape = function(config) {
    copyInstanceVars(config, this);  //copy instance variables from the config
}).prototype = {          //class members go in the prototype
    shrink: function(){
        reduce(coordinates);
    }
};

//Sphere, subclass of Shape
var Sphere;
(Sphere = function(config){
    Shape.apply(this, arguments);
}).prototype = copyInstanceVars(Shape.prototype, {  //inherit methods from Shape
    role: function(){
        move(coordinates);
    };
});

Затем, когда создаются экземпляры объектов, вы должны сделать:

var shape = new Shape({
    color: "blue",
    ...,
    coordinates: {x:10, y:20}
});

var sphere = new Sphere({
    color: "blue",
    ...,
    ...,
    radius: 10
});

Итак, в этомВ этом случае переменные экземпляра - это просто те поля, которые присутствуют во всем, что вы передаете в конструктор, а функция copyInstanceVars позаботится об этом процессе копирования.(проверка hasOwnProperty гарантирует, что мы получаем только переменные экземпляра).

В этом примере также показано, как наследовать методы с помощью той же функции copyInstanceVars.Но на этот раз мы применим его к прототипу конструктора (потому что мы «объявили» методы как переменные экземпляра в прототипе)

...