Использование 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
.
Да, первая функция не имеет отношения к экземпляру объекта этой функции конструктора , вы можете считать ее как статический метод .
В функциях 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();
Да, первый - это 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 , является прежде всего синтаксическим сахаром над существующей моделью наследования на основе прототипа.
Для визуальных учащихся при определении функции без .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 + /
Когда вы создаете несколько экземпляров MyClass, у вас будет только один экземпляр publicMethod в памяти, но в случае privilegedMethod вы создадите множество экземпляров, а staticMethod не будет иметь отношения к экземпляру объекта.
Вот почему прототипы сохраняют память.
Кроме того, если вы изменяете свойства родительского объекта, соответствующее свойство дочернего объекта не было изменено, оно будет обновлено.
MyClass
, мы создаем для каждого экземпляр функцииprivilegedMethod
. ОднакоpublicMethod
создается только один раз для всех созданных экземпляров. – Menda 17 January 2012 в 01:39