アンチについて

アンチ巨人」に代表されるように世の中にはアンチがある。

アンチ

アンチとは、上でも述べたが特定の個人や団体などを嫌う者のことである。

端的にはそういうことだけど、むしろ愛情の裏返しとも思う。


巨人のことを例に上げると、巨人は資金が多く、強い選手をたくさん補強する。常勝。
と様々な優位性を持っているチームとして君臨している(しなければいけないことになっている)。
アンチはそういう突出した杭を打ちたい。
もし、巨人が資金も乏しく弱小であったらどうだろう。
アンチとしても興味が無くアンチのし甲斐がない。

つまり、アンチシズムには叩きたい対象が叩くべく水準に達している必要がある。

自分は何が好きでないかを明確にすることで、
ある種のアイデンティティを確立することに役立てることができ、
そして、好きでない対象が好きでないための条件で在り続けることを
心のどこかで望んでいるとも言えなくはない。
そういう人たちのことをシニカルとか言ったりする。

prototypeとリテラルの、まとまりのないまとめ

リテラルでprototype書いたら - ynsynsのブログの続き。

function Y(){};
Y.prototype={a:'a'};
var y=new Y();

console.log(y.__proto__); // Object { a="a"}
console.log(y.constructor);  // Object()

何故コンストラクタがObjectになるか。

Y.prototype={a:'a'};

これが何をしているかが問題。
リテラル代入は、いきなりプロパティを設定しているのではなく、
いったん空オブジェクトをnewされてからプロパティを入れ直しているということ。

つまり

Y.prototype={}; //いったん空オブジェクトを生成したことになる。なるほどnew Objectと同じ!
Y.prototype.a='a'; //そのあとで、プロパティを設定。

暗黙的にこの2段階の処理がされている。
new Objectされてるのと同義なら、コンストラクタはObjectになるわけだそりゃ。

脱線して、var宣言の例

var x=0; //初期化と同時に値をセットしたい

しかし実際の処理は

var x=undefined; //コンパイル時はスコープのトップレベルでundefinedで定義されたことになる。
    x=0; //続いて値のセット

昔それ周りのこと書いてた。
2010-07-27 - ささいなoutput

話を戻す。
prototypeの場合は厳密にはvar宣言とは異なるかもしれないが、
変数(プロパティ)に値をセットするというのは、
いったん内容が消去(代入されるオブジェクトのコンストラクタに初期化)されてから、新たに書き直されるという動きとなる。
従って、書き直される以前に持っていた属性(適切な言い方ではないかも)が消えてしまう。

パターン実験

function Oya1(){};
Oya1.prototype={a:1}; //リテラルで初期化
var ko1=new Oya1;
console.log(ko1.constructor, ko1.a);

Oya1.prototype={a:2}; //リテラルで更新
console.log(ko1.constructor, ko1.a);


function Oya2(){}
Oya2.prototype.a=1;   //プロパティで初期化
var ko2=new Oya2; 
console.log(ko2.constructor, ko2.a);

Oya2.prototype={a:2}; //リテラルで更新
console.log(ko2.constructor, ko2.a);


function Oya3(){}
Oya3.prototype.a=1;   //プロパティで初期化
var ko3=new Oya3;
console.log(ko3.constructor, ko3.a);

Oya3.prototype.a=2;   //プロパティで更新
console.log(ko3.constructor, ko3.a);


function Oya4(){}
Oya4.prototype={a:1}; //リテラルで初期化
var ko4=new Oya4;
console.log(ko4.constructor, ko4.a);

Oya4.prototype.a=2;   //プロパティで更新
console.log(ko4.constructor, ko4.a);


/*結果
Object() 1
Object() 1

Oya2() 1
Oya2() 1

Oya3() 1
Oya3() 2

Object() 1
Object() 2
*/

Oya3のが最もクリーンなやり方と言える。

constructorの部分について

Oya2,Oya3のように、prototypeのプロパティに設定している場合はconstructorは破壊されず継承している。
Oya1,Oya4のようにリテラル代入した場合は、本来のconstructorが破壊されObjectになる。

プロパティ値を更新した後の挙動

Oya3,Oya4のようにプロパティに変更を与えた時には値が更新される。
Oya1,Oya2のようにリテラルで更新すると、以前の値には影響しない。

Oya2に注目

function Oya2(){}
Oya2.prototype.a=1;   //プロパティで初期化
var ko2=new Oya2; 
console.log(ko2.constructor, ko2.a); // >>>Oya2() 1

Oya2.prototype={a:2}; //リテラルで更新 
console.log(ko2.constructor, ko2.a); // >>>Oya2() 1
// 既に作ったインスタンスに影響しない!

Oya2.prototype.b=1; //追加してみる
console.log(ko2.constructor, ko2.a, ko2.b); // >>>Oya2() 1 undefined
// 追加されない! けどnewされた時点の値は保持している。

var ko20=new Oya2; // 別のインスタンス作る
console.log(ko20.constructor, ko20.a, ko20.b); // >>>Object() 2 1
// constructorが破壊されている!

ko2ではリテラル上書きされた後も、直前の内容を保持している、かつ"追加が不可能"になる。
ko20ではリテラル上書きされたあとのインタンスで、本来のconstructorは破壊され無名Objectで再定義されている。

結論としては、
constructorが破壊されたり、既存のインスタンスへの継承が絶たれたり、
jsのダイナミック性という言語的特徴を否定することにもなるし、
prototypeをリテラルで書くのはやはりよくないという認識に至る。

prototypeの定義は面倒でもプロパティごとでセットするか、applyするかがよろしいかと思う。
意図的に使う高等テクニックもあるのかもしれないけど。


最後に、Oyaとかkoとか芸の無い名前でテストして、途中で残念な気持ちになった。

node.js 始めたはずが

週末、ubuntuにnodeの環境作ってる途中で中断させられて、
そこからPCに触る暇さえ与えられなかったので、どういう状態で終わったのか分からん。

リテラルでprototype書いたら

function X(){};
X.prototype.a='a';
var x=new X();

console.log(x.__proto__); // X { a="a"}
console.log(x.constructor); // X()

疑惑のリテラル

function Y(){};
Y.prototype={a:'a'};
var y=new Y();

console.log(y.__proto__); // Object { a="a"}
console.log(y.constructor);  // Object()

何故YでなくObject?
どういう違いでこうなるのかしら。
リテラルで代入すると実はダメってこと?


ははーん、ではこれなら?

function Z(){};

(function(){
  this.a='a';
}).apply(Z.prototype);

var z=new Z();

console.log(z.__proto__);  // Z { a="a"}
console.log(z.constructor); // Z()

これだと大丈夫。


今まで結構普通にリテラルで使ってきたけど、実はよくないのだろうか。
確かにまるごと代入しているので、元あるもの(しかしprototypeの初期値は空の筈??)を上書きしているには違いないが。。

新しいノートPCの品定め

長年使っていた嫁のxpが壊れたようで、新しいノートPCを購入検討中。

Macbookにしようよ!というと、「あの顔のやつが嫌いだからmac無理」と言う。
学生の時に見て以来、嫌いなのだという。 

※顔のやつ

f:id:ynsyns:20120228144334j:plain

(自分が使うわけでないし)それなら仕方ないということで、任せたと言われたのでWin7マシンを品定めしている。
性能とデザインと価格を考慮した結果、ASUS U30SDが妥当ではないかということで、これが今のところ有力。

購入に際して加味する点

  • ”第2世代”core i5くらいかな
  • メモリ4Gあれば満足
  • 8万以下
  • テンキー要らない
  • 13.3インチ
  • できるだけ軽いやつ
  •  DVDドライブが要るねん
  • シルバー色を所望された 

これでポチる準備はできたが、今すぐという感じでもないようなのでもう少し機を待つ。 


あ、もしDVDドライブ外付けで合意してくれるなら、もうすこし選択の幅広がるな。

 

※結論としては壊れていなかったみたい。でもさすがに買い替え時期。

aspire oneのバッテリー

先日(まだまだ現役の)aspire oneの電源を入れるも起動せず、
AC電源つなげると、バッテリーマークが点滅していた。
まさかバッテリー終了のお知らせか!と思ったが、消耗でなくバッテリー自体を認識していないっぽい。
なんぞこれ?ググると、色々出てきた。
どうやらBIOSをアップデートしたら直るようなことがチラホラ書かれていたので試す。

デュアルOS化しているaspire oneのWindowsXPの方を久々(何年ぶりか)に起動。
まず、Avastの期限が切れているよ、と怒られた。→ Avast更新せず消した。→MSE入れといた。
さて、AcerのサイトからBIOSの最新版を落としてXPで展開、実行、再起動。あっさり完了。
Windows Updateがどっさり落ちてきた。(;´Д`)

※一応 BIOS絡みのことでは、自己責任で的なことが書かれているので注意。
BIOS設定画面で確認すると更新されてた。
そしてバッテリーも認識されたようで、赤点灯にって変わってた。

というわけで、バッテリーがバッチリーになったというお話。