Как правильно кодировать свойство и метод javascript, используя функцию «prototype»? - PullRequest
2 голосов
/ 11 января 2011

Я пытаюсь научиться создавать и использовать свойства и методы javascript с использованием прототипов javascript, и у меня возникли некоторые трудности.

В следующем коде я пытаюсь создать простой объект под названием radiusимеет радиус 4 и метод getCircumference, который создает окружность с использованием значения радиуса объекта.

function radius()
{
    this = 4;
}

function getCircumference()
{
    var pi = 3.141592;
    var circumference = this.value * 2 * pi;
    document.write(circumference);
}

radius.prototype.circumference = getCircumference;
radius.circumference();

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

Ответы [ 3 ]

4 голосов
/ 11 января 2011

Есть несколько проблем с вашим кодом, как технически, так и концептуально.

С технической стороны вы не можете присвоить this.Измените эту строку на this.value = 4 и объедините ее с предложением pst (измените последнюю строку на (new radius()).curcumference()), и я верю, что ваш код будет работать как есть.

Концептуально, это, вероятно,более полезно думать о окружности как об объекте и как о , имеющей радиус , а не думать о самом радиусе как об объекте.Попробуйте это:

// traditionally, class name are TitleCased
function Circle(radius) {
    this.radius = radius;
}

Circle.prototype = {
    circumference: function() {
        return this.radius * 2 * Math.PI;
    }
};

var circle = new Circle(4);
document.write(circle.circumference());
2 голосов
/ 11 января 2011

Давайте сначала разберемся с некоторыми основами прототипа :

Объекты функций наследуются от Function.prototype.Модификации объекта Function.prototype распространяются на все экземпляры Function.

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

Когда вы определяете любую функцию в JavaScript, у вас есть потенциал для созданияэкземпляр функции (аналогично object в ООП).

Рассмотрим следующий пример:

function example(some, params)
{
  var foo = some;
  this.bar = params;
  //more code...
}

Если он был вызван в контексте окна:

window.example('fizz', 'buzz');

вы бы знали, что foo была временной переменной, хранящей значение 'fizz' на время вызова функции, и что для window.bar будет установлено значение 'buzz'.

Однако, если бы он использовался для создания нового объекта

var temp = new example('fizz', 'buzz');

, вы бы знали, что foo по-прежнему была временной переменной, хранящей значение 'fizz' на протяжениивызов функции, и теперь temp.bar будет установлен в значение 'buzz'.


Если бы мы должны были определить новое свойство в прототипе:

example.prototype.baz = 'w00t';

Каждый экземпляр функции example теперь будет иметь свойство baz со значением* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * [10} * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *} * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 1.} * * * * * * * * * * * * * * * * * *.для них определена функция.


Что происходит, когда вы хотите переопределить значение прототипа?

Если вы переопределите свойство в prototype, все экземпляры будут обновлены:

example.prototype.baz = 'new w00t';

Однако, если вы переопределите свойство в экземпляре, будет обновлен только этот экземпляр :

temp.baz = 'not w00t';

Ваш пример:

Вы хотите circle объект, имеющий радиус:

function circle(r)
{
  //probably should do some value checking stuff here
  this.radius = r;
}

Каждый circle объект имеет окружность:

circle.prototype.getCircumference()
{
  return Math.PI * 2 * this.radius;
}

Теперь, если вы создаете новый круг, вы можетеполучить длину окружности:

var c = new circle(5);
console.log(c.getCircumference());

Краткое примечание:

Определение функции для прототипа позволяет всем экземплярам совместно использовать ссылку на одну и ту же функцию.

Есливы создаете функцию для каждого экземпляра:

function temp()
{
  this.func = function(){...};
}

Скорее всего, производительность будет хуже, чем уразрешить экземплярам использовать функцию-прототип:

function temp(){}

temp.func = function(){...};
2 голосов
/ 11 января 2011

Try: (new radius).circumference() - объект в свойстве ".prototype" функции "parent" помещается в цепочку "[[prototype]]" (подсказка ключевого слова :-) для объектов, полученных из него с помощью new.

Если ваш конструктор принял аргумент, вы можете это сделать, возможно: new radius(42).circumference().

Подробнее см. http://jibbering.com/faq/notes/closures/.

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