Если мы используем Java 7 и выше, а также знаем, какой контент будет добавлен (добавлен) в файл, мы можем использовать метод newBufferedWriter в пакете NIO.
public static void main (String [] args) {Путь FILE_PATH = Paths.get ("C: / temp", "temp.txt"); String text = "\n Добро пожаловать в Java 8"; // Запись в файл temp.txt try (BufferedWriter writer = Files.newBufferedWriter (FILE_PATH, StandardCharsets.UTF_8, StandardOpenOption.APPEND)) {writer.write (текст); } catch (IOException e) {e.printStackTrace (); }}
Следует отметить несколько замечаний:
] StandardCharsets
. try-with-resource
, в которой ресурсы автоматически закрываются после попытки. ] Хотя OP не спросил, но на всякий случай мы хотим искать строки с определенным ключевым словом, например privacy
мы можем использовать потоковые API в Java:
// Чтение из файла первой строки, содержащей слово «конфиденциальный», try {Stream & lt; String & gt; lines = Files.lines (FILE_PATH); Дополнительно & Lt; & Строка GT; containsJava = lines.filter (l- & gt; l.contains («конфиденциально»)) findFirst (); if (содержитJava.isPresent ()) {System.out.println (содержитJava.get ()); }} catch (IOException e) {e.printStackTrace (); }
Ответ @PeterOlson может быть обработан в тот же день, но выглядит как
Object.create
. Я бы пошел на путь-конструктор, как @ user166390, говорится в комментариях. Причина, по которой я некроментировал этот пост, состоит в том, что мне нужна такая реализация.В настоящее время мы можем использовать
Object.assign
( кредиты для решения @SayanPal ) & amp; Синтаксис ES6:class Person { constructor(obj) { obj && Object.assign(this, obj); } getFullName() { return `${this.lastName} ${this.firstName}`; } }
Использование:
const newPerson = new Person(person1) newPerson.getFullName() // -> Freeman Gordon
Ответ ES5 ниже
function Person(obj) { for(var prop in obj){ // for safety you can use the hasOwnProperty function this[prop] = obj[prop]; } }
Использование:
var newPerson = new Person(person1); console.log(newPerson.getFullName()); // -> Freeman Gordon
Используя более короткую версию, 1.5 liner:
function Person(){ if(arguments[0]) for(var prop in arguments[0]) this[prop] = arguments[0][prop]; }
jsfiddle
Нет.
Но если вы хотите обработать свой объект person1
, как если бы это был Person
, вы можете вызвать методы на прототипе Person
на person1
с call
:
Person.prototype.getFullNamePublic = function(){
return this.lastName + ' ' + this.firstName;
}
Person.prototype.getFullNamePublic.call(person1);
Хотя это явно не будет работать для привилегированных методов, созданных внутри конструктора Person, подобно вашему getFullName
методу.
Это взято из нескольких других ответов здесь, но я думал, что это может помочь кому-то. Если вы определяете следующую функцию на своем пользовательском объекте, то у вас есть фабричная функция, в которую вы можете передать общий объект, и он вернет вам экземпляр класса.
CustomObject.create = function (obj) {
var field = new CustomObject();
for (var prop in obj) {
if (field.hasOwnProperty(prop)) {
field[prop] = obj[prop];
}
}
return field;
}
Используйте это как
var typedObj = CustomObject.create(genericObj);
Это всего лишь завершение ответа Саян Пэла в более короткой форме, стиль ES5:
var Foo = function(){
this.bar = undefined;
this.buzz = undefined;
}
var foo = Object.assign(new Foo(),{
bar: "whatever",
buzz: "something else"
});
Мне это нравится, потому что он ближе всего к самой опрятной инициализации объекта в .Net:
var foo = new Foo()
{
bar: "whatever",
...
Это не совсем ответ, скорее, обмен моими выводами, и, надеюсь, вы получите какой-то критический аргумент для / против него, поскольку я точно не знаю, насколько он эффективен.
Недавно мне нужно было сделайте это для моего проекта. Я сделал это, используя Object.assign
, точнее это делается примерно так: Object.assign(new Person(...), anObjectLikePerson)
.
Вот ссылка на мой JSFiddle и также основная часть кода:
function Person(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
this.getFullName = function() {
return this.lastName + ' ' + this.firstName;
}
}
var persons = [{
lastName: "Freeman",
firstName: "Gordon"
}, {
lastName: "Smith",
firstName: "John"
}];
var stronglyTypedPersons = [];
for (var i = 0; i < persons.length; i++) {
stronglyTypedPersons.push(Object.assign(new Person("", ""), persons[i]));
}
extend
, которую имеют большинство фреймворков ... ИObject.assign
заменяет эту функцию ... На сегодняшний день. только Internet Explorer и Safari & lt; = 9 не поддерживают его. Что бы я сделал, это захватить Object.assign polyfill и использовать его, когда реального объекта Object.assign там нет. В моем проекте у меня есть фрагмент кода, который проверяет необходимые функции и, если они отсутствуют, загружает второй скрипт с полиполнами в нем для этих функций. – Stijn de Witt 31 January 2017 в 13:00Object.assign
над этим решением. См. Решение @ SayanPal, которое использует метод assign. Я когда-нибудь обновлю этот ответ;) – A1rPun 2 February 2017 в 13:57Object.assign
– A1rPun 5 September 2017 в 14:01