Основная проблема с использованием this
вместо prototype
состоит в том, что при переопределении метода конструктор базового класса будет по-прежнему ссылаться на переопределенный метод. Подумайте над этим:
BaseClass = function() {
var text = null;
this.setText = function(value) {
text = value + " BaseClass!";
};
this.getText = function() {
return text;
};
this.setText("Hello"); // This always calls BaseClass.setText()
};
SubClass = function() {
// setText is not overridden yet,
// so the constructor calls the superclass' method
BaseClass.call(this);
// Keeping a reference to the superclass' method
var super_setText = this.setText;
// Overriding
this.setText = function(value) {
super_setText.call(this, "SubClass says: " + value);
};
};
SubClass.prototype = new BaseClass();
var subClass = new SubClass();
console.log(subClass.getText()); // Hello BaseClass!
subClass.setText("Hello"); // setText is already overridden
console.log(subClass.getText()); // SubClass says: Hello BaseClass!
против:
BaseClass = function() {
this.setText("Hello"); // This calls the overridden method
};
BaseClass.prototype.setText = function(value) {
this.text = value + " BaseClass!";
};
BaseClass.prototype.getText = function() {
return this.text;
};
SubClass = function() {
// setText is already overridden, so this works as expected
BaseClass.call(this);
};
SubClass.prototype = new BaseClass();
SubClass.prototype.setText = function(value) {
BaseClass.prototype.setText.call(this, "SubClass says: " + value);
};
var subClass = new SubClass();
console.log(subClass.getText()); // SubClass says: Hello BaseClass!
Если вы считаете, что это не проблема, то это зависит от того, можете ли вы жить без личных переменных, и достаточно ли у вас опыта) знать утечку, когда вы видите один. Кроме того, неудобно помещать логику конструктора после определения метода.
var A = function (param1) {
var privateVar = null; // Private variable
// Calling this.setPrivateVar(param1) here would be an error
this.setPrivateVar = function (value) {
privateVar = value;
console.log("setPrivateVar value set to: " + value);
// param1 is still here, possible memory leak
console.log("setPrivateVar has param1: " + param1);
};
// The constructor logic starts here possibly after
// many lines of code that define methods
this.setPrivateVar(param1); // This is valid
};
var a = new A(0);
// setPrivateVar value set to: 0
// setPrivateVar has param1: 0
a.setPrivateVar(1);
//setPrivateVar value set to: 1
//setPrivateVar has param1: 0
и
var A = function (param1) {
this.setPublicVar(param1); // This is valid
};
A.prototype.setPublicVar = function (value) {
this.publicVar = value; // No private variable
};
var a = new A(0);
a.setPublicVar(1);
console.log(a.publicVar); // 1
. Кажется, существуют ответы и на ссылку Microsoft и на ссылку SQLITE, и это - причина, некоторые люди заставляют свойство LastInsertRowId работать, и другие не.
Лично я не использую PK, поскольку это - просто псевдоним для rowid столбца. Используя rowid вокруг дважды с такой скоростью, как тот, который Вы создаете. Если у меня есть Столбец текста для PK, я все еще использую rowid и просто делаю столбец текста уникальным. (для SQLite 3 только. Вам нужно Ваше собственное для v1 & v2 как вакуум изменит rowid числа)
Тем не менее, способом получить информацию от записи в последней вставке является код ниже. Так как функция делает левое, соединяют с собой, я ОГРАНИЧИВАЮ ее 1 только для скорости, даже если Вы не сделаете то от основного оператора SELECT только будет 1 запись.
SELECT my_primary_key_column FROM my_table
WHERE rowid in (SELECT last_insert_rowid() LIMIT 1);