Если Object () является классом-оболочкой для объекта, как вы можете называть его .create? [Дубликат]

Использование java.nio. Файлы вместе с java.nio.file. StandardOpenOption

  PrintWriter out = null;  BufferedWriter bufWriter;  try {bufWriter = Files.newBufferedWriter (Paths.get («log.txt»), Charset.forName («UTF8»), StandardOpenOption.WRITE, StandardOpenOption.APPEND, StandardOpenOption.CREATE);  out = new PrintWriter (bufWriter, true);  } catch (IOException e) {// О, нет!  Не удалось создать PrintWriter} // После успешного создания PrintWriter out.println («Текст будет добавлен»);  // После написания, не забудьте закрыть!  out.close ();   

Это создает BufferedWriter , используя Files, который принимает параметры StandardOpenOption и автозапуска PrintWriter из результирующего BufferedWriter . Метод PrintWriter println () может быть вызван для записи в файл.

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

Paths.get («путь здесь») может заменить на новый файл («путь здесь»). toPath () . И Charset.forName («charset name») можно изменить, чтобы разместить желаемую Charset .

440
задан Rob W 27 December 2011 в 17:36
поделиться

4 ответа

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

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

Вторая функция, поскольку вы расширяете прототип функции конструктора, она будет доступна для всех экземпляров объектов, созданных с помощью ключевого слова new , и контекста внутри этого (ключевое слово this ) будет ссылаться на фактический экземпляр объекта, где вы его называете.

Рассмотрим этот пример:

// constructor function
function MyClass () {
  var privateVariable; // private member only available within the constructor fn

  this.privilegedMethod = function () { // it can access private members
    //..
  };
}

// A 'static method', it's just like a normal function 
// it has no relation with any 'MyClass' object instance
MyClass.staticMethod = function () {};

MyClass.prototype.publicMethod = function () {
  // the 'this' keyword refers to the object instance
  // you can access only 'privileged' and 'public' members
};

var myObj = new MyClass(); // new object instance

myObj.publicMethod();
MyClass.staticMethod();
647
ответ дан CMS 16 August 2018 в 03:40
поделиться
  • 1
    Это было взято из: code.google.com/intl/es/speed/articles/… Также важно сказать, что если мы создаем много экземпляров MyClass, мы создаем для каждого экземпляр функции privilegedMethod. Однако publicMethod создается только один раз для всех созданных экземпляров. – Menda 17 January 2012 в 01:39
  • 2
    Но почему Function.prototype.method == Function.method? – Raghavendra 25 November 2015 в 19:44
  • 3
    @Raghavendra это не – Zorgatone 12 January 2017 в 14:58

Да, первый - это static method, также называемый class method, а второй - instance method.

Рассмотрим следующие примеры, чтобы понять это более подробно.

В ES5

function Person(firstName, lastName) {
   this.firstName = firstName;
   this.lastName = lastName;
}

Person.isPerson = function(obj) {
   return obj.constructor === Person;
}

Person.prototype.sayHi = function() {
   return "Hi " + this.firstName;
}

В приведенном выше коде isPerson является статическим методом, а sayHi является методом экземпляра Person.

Ниже описано, как создать объект из конструктора Person.

var aminu = new Person("Aminu", "Abubakar");

Использование статического метода isPerson.

Person.isPerson(aminu); // will return true

Использование метода экземпляра sayHi.

aminu.sayHi(); // will return "Hi Aminu"

В ES6

class Person {
   constructor(firstName, lastName) {
      this.firstName = firstName;
      this.lastName = lastName;
   }

   static isPerson(obj) {
      return obj.constructor === Person;
   }

   sayHi() {
      return `Hi ${this.firstName}`;
   }
}

Посмотрите, как было использовано ключевое слово static для объявления статического метода isPerson.

Чтобы создать объект класса Person.

const aminu = new Person("Aminu", "Abubakar");

Использование статического метода isPerson.

Person.isPerson(aminu); // will return true

Использование метода экземпляра sayHi.

aminu.sayHi(); // will return "Hi Aminu"

ПРИМЕЧАНИЕ. Оба примера по существу одинаковы, JavaScript остается бесклассовым. class, введенный в ES6 , является прежде всего синтаксическим сахаром над существующей моделью наследования на основе прототипа.

1
ответ дан Aminu Kano 16 August 2018 в 03:40
поделиться

Для визуальных учащихся при определении функции без .prototype

ExampleClass = function(){};
ExampleClass.method = function(customString){
             console.log((customString !== undefined)? 
                          customString : 
                          "called from func def.");}
ExampleClass.method(); // >> output: `called from func def.`  

var someInstance = new ExampleClass();
someInstance.method('Called from instance');
    // >> error! `someInstance.method is not a function`  

С тем же кодом, если .prototype добавлен,

ExampleClass.prototype.method = function(customString){
             console.log((customString !== undefined)? 
                          customString : 
                          "called from func def.");}
ExampleClass.method();  
      // > error! `ExampleClass.method is not a function.`  

var someInstance = new ExampleClass();
someInstance.method('Called from instance');
                 // > output: `Called from instance`

Чтобы сделать его более понятным,

ExampleClass = function(){};
ExampleClass.directM = function(){}  //M for method
ExampleClass.prototype.protoM = function(){}

var instanceOfExample = new ExampleClass();

ExampleClass.directM();     ✓ works
instanceOfExample.directM();   x Error!

ExampleClass.protoM();     x Error!
instanceOfExample.protoM();  ✓ works

**** Примечание для примера выше, someInstance.method () не будет выполняться как, ExampleClass .method () вызывает ошибку & amp; выполнение не может продолжаться. Но ради иллюстрации & amp; Простое понимание, я сохранил эту последовательность. ****

Результаты, полученные из chrome developer console & amp; JS Bin Нажмите на ссылку jsbin выше, чтобы выполнить код. Переключить секцию комментария с помощью ctrl + /

7
ответ дан SAm 16 August 2018 в 03:40
поделиться

Когда вы создаете несколько экземпляров MyClass, у вас будет только один экземпляр publicMethod в памяти, но в случае privilegedMethod вы создадите множество экземпляров, а staticMethod не будет иметь отношения к экземпляру объекта.

Вот почему прототипы сохраняют память.

Кроме того, если вы изменяете свойства родительского объекта, соответствующее свойство дочернего объекта не было изменено, оно будет обновлено.

16
ответ дан user2440156 16 August 2018 в 03:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: