2014-01-22 2 views
3

Я сделал много попыток понять ООП в JavaScript без успеха.Преобразование Java в JavaScript

Все статьи, которые я читал до сих пор очень запутать и не объясняют succintly ООП в JS

В последней попытке понять ООП в JavaScript, может кто-то перевести на JS следующий код, мольбы?

public class Base 
{ 
    public String firstName; // public scope to simplify 
    public String lastName; // the same as above 

    Base(String firstName, String lastName) 
    { 
     this.firstName=firstName; 
     this.lastName=lastName; 
    } 
} 


public class Derived extends Base 
{ 
    public int age; // public scope to simplify 

    Derived(String firstName, String lastName, int age) 
    { 
     super(firstName, lastName); 
     this.age=age; 
    } 
} 

Внутри основной()

Derived person = new Derived("John", "Doe", 25); 

    System.out.println("My name is " + person.firstName + " " + person.lastName + " and I have " + person.age + " years old."); 

Выход:

My name is John Doe and I have 25 years old. 

Можете ли вы преобразовать это в JavaScript?

Другой вопрос: Можем ли мы иметь полиморфизм в JavaScript?

Спасибо

+1

Что вы пробовали? – epascarello

+0

Я попытаюсь преобразовать код выше, как вы можете видеть. – user3224159

+1

hey man, его язык сценариев. вы НЕ МОЖЕТЕ сделать что-нибудь подобное в javascript –

ответ

0

Вот фрагмент, как вы можете создать объект в JavaScript.

person=new Object(); 
person.firstname="John"; 
person.lastname="Doe"; 
person.age=50; 
person.eyecolor="blue"; 

А вот как можно реализовать наследование в JavaScript

function Mammal(name){ 
    this.name=name; 
    this.offspring=[]; 
} 
Mammal.prototype.haveABaby=function(){ 
    var newBaby=new Mammal("Baby "+this.name); 
    this.offspring.push(newBaby); 
    return newBaby; 
} 
Mammal.prototype.toString=function(){ 
    return '[Mammal "'+this.name+'"]'; 
} 


Cat.prototype = new Mammal();  // Here's where the inheritance occurs 
Cat.prototype.constructor=Cat;  // Otherwise instances of Cat would have a constructor of Mammal 
function Cat(name){ 
    this.name=name; 
} 
Cat.prototype.toString=function(){ 
    return '[Cat "'+this.name+'"]'; 
} 


var someAnimal = new Mammal('Mr. Biggles'); 
var myPet = new Cat('Felix'); 
alert('someAnimal is '+someAnimal); // results in 'someAnimal is [Mammal "Mr. Biggles"]' 
alert('myPet is '+myPet);    // results in 'myPet is [Cat "Felix"]' 

myPet.haveABaby();     // calls a method inherited from Mammal 
alert(myPet.offspring.length);  // shows that the cat has one baby now 
alert(myPet.offspring[0]);   // results in '[Mammal "Baby Felix"]' 

Вы можете найти много ссылок на то же, некоторые из которых являются:

1) Link 1

2) Link 2

3) Link 3

+0

Теперь я хочу переменную, которая наследует ваш код и добавляет больше – user3224159

+0

Это неправильно. Вы, безусловно, можете добиться этого с помощью наследования на основе прототипов. – Kiran

+0

yes У меня есть обновленный ответ соответственно ..... –

5

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

function Base (firstName, lastName) { 
    // same as public in Java 
    this.firstName = firstName; 
    this.lastName = lastName; 
} 

function Derived (firstName, lastName, age) { 
    // same as calling super class in Java, and you should explicitly bind this 
    Base.apply(this, arguments); 
    this.age = age; 
} 

// same as extends in Java, you just override Derived.prototype with super class prototype and you should explicitly set constructor if you want later check instanceof. 
Derived.prototype = Object.create(Base.prototype, { 
    // if you omit this line than instanceof Derived would be false, since instanceof check by prototype chain constructors. 
    constructor: { 
     value: Derived 
    } 
}); 

var person = new Derived("John", "Doe", 25); 

console.log(person instanceof Derived); // true 
console.log(person instanceof Base); // true 

console.log("My name is " + person.firstName + " " + person.lastName + " and I have " + person.age + " years old."); 

Demo


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

function bar(a, b) { 
    if (arguments.length === 2) { 
     var isInts = [].every.call(arguments, function(val) { 
      return !isNaN(val); 
     }); 
     if (isInts) { 
      console.log(a + b); 
     } 
    } else if (arguments.length > 2) { 
     console.log([].join.call(arguments, "")); 
    } 
} 

bar(2, 5); 
bar("Hello", ", ", "world", "!"); 

Demo


Смотрите также:
A re-introduction to JavaScript (JS Tutorial)
Introduction to Object-Oriented JavaScript MDN
Inheritance and the prototype chain MDN

+0

СПАСИБО (выделены жирным шрифтом). Вы ответили на мой вопрос. Я не могу дать +1, потому что SO требует 15 репутации – user3224159

+0

читайте это, чтобы понять, как наследование прототипов работает более подробно: http://dmitrysoshnikov.com/ecmascript/javascript-the-core/ – Kiran

Смежные вопросы