2017-01-23 2 views
0

У меня есть класс с методомВызов прототип без экземпляра

function MyClass(name){ 
 
    this._name = name; 
 
} 
 
MyClass.prototype.test=function(){ 
 
    console.log(this._name); 
 
}

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

var a = new MyClass('demo'); 
 
a.test();

Но, теперь я хотите позвонить этот класс как функции без создания экземпляра

MyClass('demo2').test();

Возможно ли это?

+2

Конечно, это возможно, конструкторы являются функциями. Но поведение конструктора, называемого как функция, отличается от того, что он называет его конструктором. – RobG

+0

Если вы хотите называть его «MyClass (« demo2 »). Test()', то там * требуется *, чтобы быть экземпляром для вызова 'test' * on *. Если вы просто не хотите присваивать экземпляр переменной ... ну, новый MyClass ('demo2'). Test() 'отлично работает. – deceze

ответ

4

Вы можете проверить, если this является экземпляром класса, если проверка ложна это означает, что она вызывается как функция и вы можете вернуть новый экземпляр:

function MyClass(name){ 
    if (!(this instanceof MyClass)) { 
    return new MyClass(name); 
    } 
    this._name = name; 
} 

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

1

Да, это возможно. Вы можете вернуть пользовательский объект с необходимыми свойствами.

function MyClass(name){ 
 
    // private variable 
 
    var _name = name; 
 
    var getName = function(){ 
 
    return _name; 
 
    }; 
 
    
 
    // public properties 
 
    return { 
 
    test: getName 
 
    } 
 
} 
 
console.log(MyClass('Foo').test()) 
 
console.log(MyClass('Foo')._name)

или вы можете иметь внутренний частный класс, который доступен только внутри MyClass.

function MyClass(name){ 
 
    function Person(){ 
 
    this._name = name; 
 
    } 
 
    Person.prototype.getName = function(){ 
 
    return this._name 
 
    } 
 
    return new Person() 
 
} 
 
console.log(MyClass('Foo').getName()) 
 
console.log(MyClass('Foo')._name)

1

Использование new стара :)

Новый способ заключается в использовании Object.create, так как это дает вам больший контроль над созданным объектом. Неважно, если вы вызываете его с или без нового, например new MyClass('demo').test() или MyClass('demo').test(), он всегда будет возвращать объект, созданный в конструкторе. Вы получаете полный контроль над свойствами и можете сделать их доступными только для чтения и undeleateable и решить, должны ли они быть перечислены или нет. Вы даже можете создать getters и setters.

Метод Object.create() создает новый объект с указанным объектом и свойствами прототипа.

Object.create (прото [, propertiesObject])

прото Объект, который должен быть прототипом вновь созданного объекта.

propertiesObject Дополнительно.Если задано и не определено, объект, чьи перечисляемые собственные свойства (то есть те свойства, которые определены сами по себе и не перечисляемые свойства вдоль его цепи прототипов), указывают дескрипторы свойств, которые должны быть добавлены к вновь созданному объекту, с соответствующими именами свойств. Эти свойства соответствуют второму аргументу Object.defineProperties().

  • конфигурируемый истинно, если и только если тип этого дескриптора свойств может быть изменен, и если свойство может быть удалено из соответствующего объекта. По умолчанию false.

  • перечислим верно, если и только если это свойство проявляется при перечислении свойств на соответствующем объекте. По умолчанию false.

  • значение Величина, связанная с недвижимостью. Может быть любым допустимым значением JavaScript (число, объект, функция и т. Д.). По умолчанию undefined.

  • перезаписываемый истинно тогда и только тогда, когда значение, связанное со свойством может быть изменено с помощью оператора присваивания. По умолчанию false.

  • получить Функции выполнения служит в качестве геттера для свойства, или не определен, если нет газопоглотителя. Возврат функции будет использоваться как значение свойства. По умолчанию undefined.

  • установить Функцию, которая служит в качестве инкубатора для свойства, или не определен, если нет сеттера. Функция получит в качестве единственного аргумента новое значение, которое присваивается свойству. По умолчанию undefined.

Возвращаемое значение Новый объект с указанным объектом прототипа и свойств.

// Constructor for MyClass 
 
function MyClass(name){ 
 
    // Create the new object with Object.create and using the 
 
    // prototype of MyClass as a base, and add a new read only 
 
    // property "name". 
 
    return Object.create(
 
    MyClass.prototype, 
 
    { 
 
     name : { 
 
     //enumerable: false, 
 
     //writable : false, 
 
     value : name 
 
     } 
 
    } 
 
) 
 
} 
 

 
// Dedine new properties on the prototype, 
 
// using Object.defineProperties that allows 
 
// more control over the properties. 
 

 
Object.defineProperties(
 
    MyClass.prototype, 
 
    { 
 
    test: // name of property 
 
     { 
 
     value: // value of property, in this case a function 
 
      function(){ 
 
      console.log(this.name); 
 
      return this; // Return "this" to allow chaining 
 
      } 
 
     // No other attributes defined, and therefore using 
 
     // default values: read only, not enumerabe and 
 
     // not configurable. 
 
     }, 
 
    setCord: 
 
     { 
 
     value: 
 
      function (x1, y1, x2, y2) { 
 
      this.x1 = x1; 
 
      this.y1 = y1; 
 
      this.x2 = x2; 
 
      this.y2 = y2; 
 
      return this; 
 
      } 
 
     }, 
 
    width: 
 
     { 
 
     get: // A getter 
 
      function() { 
 
      return this.x2 - this.x1; 
 
      }, 
 
     set: // A setter 
 
      function(value) { 
 
      this.x2 = this.x1 + value; 
 
      } 
 
     }, 
 
    height: 
 
     { 
 
     get: 
 
      function() { 
 
      return this.y2 - this.y1; 
 
      }, 
 
     set: 
 
      function (value) { 
 
      this.y2 = this.y1 + value; 
 
      } 
 
     } 
 

 
    } 
 
); 
 

 
var a= MyClass('DEMO').test(); 
 

 
a.setCord(10,20,50,60); // Set the cords. 
 

 
// Display the cords, and using the getters of with an height 
 
// that calculates the with and height on the fly. 
 
console.log(
 
    "x1:%d, y1:%s, x2:%d, y2:%d, width:%d, height:%d", 
 
    a.x1, a.y1, a.x2, a.y2, a.width, a.height 
 
); 
 
a.width = 100; // Using the setter to set the new width. 
 
a.height = 100; 
 

 
// Show the new coordinates. Notice that x2, y2, widtgh 
 
// and height has changed. 
 
console.log(
 
    "x1:%d, y1:%s, x2:%d, y2:%d, width:%d, height:%d", 
 
    a.x1, a.y1, a.x2, a.y2, a.width, a.height 
 
);

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