ООП Javascript против Java (или других, таких как PHP) - PullRequest
1 голос
/ 06 ноября 2011

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

Спасибо!

Ответы [ 3 ]

9 голосов
/ 06 ноября 2011

То, что большинство людей делает, это использует функции конструктора, например:

function MyClass(a, b) {
    // Private instance properties
    var x = "secret";
    var y = "also secret";

    // Public instance properties
    this.a = a;
    this.b = b;

    // "Privileged" methods; can access private and public properties
    this.foo = function () {
        return x + " " + this.a;
    };
}

// "Public" methods; cannot access private properties
MyClass.prototype.bar = function () {
    return this.a + " " + this.b;
};

// Public shared properties; not recommended:
MyClass.prototype.w = "stuff";

// Static methods
MyClass.baz = function () {
    return "i am useless";
};

Затем вы использовали бы эту функцию конструктора следующим образом:

var instance = new MyClass("hi", "Meen");

asssert.equal(instance.foo(), "secret hi");
assert.equal(instance.bar(), "hi Meen");
assert.equal(MyClass.baz(), "i am useless");

var also = new MyClass("hi", "Raynos");

instance.w = "more stuff";
assert.equal(also.w, "more stuff");

Есливы хотели бы наследовать, вы бы сделали что-то вроде:

function Inherited(a) {
    // apply parent constructor function
    MyClass.call(this, a, "Domenic");
}
Inherited.prototype = Object.create(MyClass.prototype);

var inherited = new Inherited("hello there good chap");

assert.equal(inherited.a, "hello there good chap");
assert.equal(inherited.foo(), "secret hello there good chap");
assert.equal(inherited.bar(), "hello there good chap Domenic");
4 голосов
/ 06 ноября 2011

Объектно-ориентированный JavaScript очень прост.

Вы создаете объект.

var Klass = {
  method: function () {

  },
  constructor: function() {

  },
  ...
};

И затем вы создаете экземпляр этого объекта через прототипное наследование

// instantiate
var o = Object.create(Klass);
// initialize
o.constructor();

Это отличается от классического ОО, потому что любой объект может быть "классом" в javascript. и есть только одна цепочка наследования, цепочка прототипов.

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

Также в классическом ОО у вас есть два объекта, фактический объект класса и проект для экземпляра (т.е. static). Этого не существует в javascript, потому что есть только один объект - проект.

Отказ от ответственности: Object.create - это ES5, поэтому для устаревших платформ вам потребуется es5-shim .

3 голосов
/ 06 ноября 2011

В Java вы можете создать класс, используя ключевое слово class.Класс является планом для его экземпляров (объектов).

например,

class AClass { // AClass is a class
    AClass() { } //this is the constructor which will be used to create instances of this class
}

А затем создать и экземпляр класса:

AClass obj1 = new AClass(); // an instance of the class AClass
AClass obj2 = new AClasss(); //another instance of the class AClass

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

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

В Javascript я в основном создаю объекты следующим образом:

var obj = { };

Итак, мне не нужно создавать какой-либо класс для создания объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...