블로그 이미지

GUEST

html/css/javascript 2014. 4. 2. 13:33

javascript - 상속

아리까리해서 정리하는 javascript 싸지르기 2.

1. psuedo-classical

유사 class 방식.
객체는 생성자 함수의 prototype에 접근할 수 있는 특성을 이용한다.


function A(_a){
    this.a = _a;
}                                    // ------------------- (1)
function B(_b){
    this.b = _b;
}                                    // -------------------- (2)

B.prototype = new A(1);        // ------------------- (3)
B.prototype.constructor = B; // ------------------(4)

var o = new B(2); //----------------------- (5)
console.log(o.a);    // ----------------------- (6)


(1), (2) 함수가 생성되면서 prototype property 생성 및 초기화


A.property = {constructor:A}
B.property = {constructor:B}


(3) B의 prototype property에 A의 객체를 할당.
    (2)에서 기본 할당되었던 {constructor:A}에 대한 참조를 잃는다.
   
(4) constructor property를 다시 B로 할당한다.
   
(5) 이제 B를 통해 생성한 모든 객체는 A의 property a를 참조한다.



2. prototypal
프로토타입 방식.
built in object Object의 create 함수를 이용한다. [참조]


var A = {
    a:0
}
var o = Object.create( A );

o.b = 1;
console.log(o.a);

console.log(o.b);


create 함수가 작동하는 방식은 다음과 같다.[참조]


function create( proto ){
    function F(){};
    F.prototype = proto;
    return new F();
}




3. 차이점 [참조]


psuedo-classical : class -> object

prototypal : object -> object


psuedo-classical 방식은  class(function)로부터 object를 생성한다. java에서 class - object 관계와 유사하다.

prototypal 방식은 object로부터 object를 생성한다. 


javascript 초기에 java와 유사하게 사용할 수 있도록 psuedo-classical 방식을 도입했다.

그러나 OOP의 상속 구현은, 꼭 class가 있어야 할 필요가 없다. 상위 객체의 속성을 하위 객체에서 받아서 쓸 수 있으면 된다.

class가 없는 javascript에서는 prototypal 방식이 언어 특성에 더 적합하다.


cf1) new의 작동방식, create의 작동방식을 보고 있으면 둘의 차이가 뭔지 헷갈린다. javascript의 기능이 막강해서 이런 저런 방식으로 다 사용이 가능하지만, prototypal방식이 언어 특성에 부합하다. (실제 내부 구현이 vender마다 다르니 꼭 저렇다고 말하기 어렵고..)


cf2) prototypal 방식에서는 method chaining이 가능하다.

ex) Object.create().apply(...)




,
html/css/javascript 2014. 3. 25. 16:22

javascript - 객체 생성과 함수

자꾸 까먹어서 다시 정리하는 javascript 관련 정리 싸지르기 1.



1. 객체 생성


1.1 {}

built in object인 Object를 생성한다. 

javascript의 Object는 Dictionary라서 key:value 쌍으로 property를 지정한다.


var o = {}

o.a = 1



1.2 new 연산자


new 연산자를 사용하여 객체를 생성할 수 있다.


function A(_a){

this.a = _a;

}

var o = new A(1);


new 뒤의 함수는 java의 생성자 함수처럼 property를 초기화할 수 있다.


new는 연산자로서, 아래와 같은 작업을 한다.


a. 비어있는 객체 생성

b. 생성된 객체를 this로 하여, new 뒤의 함수 실행 


다음과 같이 표현할 수 있다.


var new_op = function(_v){
                             var anonym = {}             // ------------- (a)
                             A.call( anonym, _v );      // ------------- (b) anonym을 this로 A실행
                             return anonym;
                    }



cf) 1. Object.create(...)을 사용하여 객체를 생성할 수도 있으나 다른 주제로 정리함.
     2. call(), apply() 에 대하여 다른 주제로 정리함.



2. 객체와 함수 - property


function A(_a){

this.a = _a;

}

var o = new A(1);

console.log(A);            // ----------- (a)  함수 A

console.log(o);            // ------------ (b)  함수 A의 객체 o


firefox console을 보면, (a), (b)의 결과는 각각 아래와 같다.


(a) Function A                                                          (b) object o


 




A.prototype.constructor == o.__proto__.constructor ?!



(a) Function A의 로그

함수 A의 property로 arguments, caller 와 함께 prototype이 존재한다. 

javascript engine은 소스상의 함수들에 대하여 다음과 같은 작업을 수행한다.


A.prototype = {constructor:A}




(b) object o의 로그

A에 정의된 property a외에, __proto__가 존재한다. 아래 log의 결과를 보자.


console.log(A.prototype == o.__proto__);        // (1)  true


console.log(o.__proto__.constructor)        // (2) A
console.log(o.constructor)                      // (3) A


console.log(o.prototype)                        // (4) undefined


console.log(A.prototype.constructor)       // (5) A

console.log(A.constructor)                    // (6) Function

console.log(A.__proto__.constructor)      // (7) Function


(1) A.prototype에 할당된 객체와 o.__proto__에 할당된 객체는 값이 같다. 

(2), (3) __proto__ 없이 접근할 수 있다!!! __proto__는 객체가 자신의 생성자 함수의 prototype property를 참조할 수 있도록 하는 특수 property이다. (__proto__는 firefox, chrome에서 사용하는 이름이다.)

(4) 객체에는 prototype property가 없다.

(5) A.prototype = {constructor:A} 이므로.

(6), (7) 은 나중에 정리. 참고만 하자.





결론

1. 함수가 생성될 때 A.prototype = {constructor:A} 실행.

2. 객체가 생성되면 함수의 prototype 영역에 대한 참조 property 발생.( __proto__ )







,
html/css/javascript 2012. 7. 17. 13:17

cloud9 설치

nodejs용 에디터를 찾다가 cloud9을 설치해 보았다. 대문은 c9.io 이다.


설치는 아래처럼 npm을 이용하여 간단하게 진행했다.


npm install cloud9


설치되는 내용을 자세히 안 봤더니 어디에 설치되었는지 모르겠다.

/usr/local/에는 없고, ~/node_modules/cloud9을 만들고 그 밑에 풀어놓았다. 설치형이 아닌가보네.

(참고로, npm이 내려받은 파일은 ~/.npm/에 있다.)


~/node_modules/cloud9/README.md를 열어보면 실행할 수 있도록 설명이 나와있다.

linux와 osx는 bin/cloud9.sh을 실행하란다. 그런데 실행하면 에러난다.


>~/node_modules/cloud9/bin/cloud9.sh

OSX

node.js:134
        throw e; // process.nextTick error, or 'error' event on first tick
        ^
TypeError: Object #<Object> has no method 'main'
    at Object.<anonymous> (~/node_modules/cloud9/bin/cloud9.js:42:19)
    at Module.<anonymous> (module.js:402:26)
    at Object..js (module.js:408:10)
    at Module.load (module.js:334:31)
    at Function._load (module.js:293:12)
    at Array.<anonymous> (module.js:421:10)
    at EventEmitter._tickCallback (node.js:126:26)


문제는 bin/cloud9.js파일의42line이다.

구글링해보니 경로에 문제가 있는 것 같다. server/cloud9으로 바꿔주면 된다고 한다.


[변경전] require("cloud9").main(options);

[변경후] require("../server/cloud9").main(options);


뭔가 상대경로가 맞지 않은 것 같다. 음.. 그냥 날로 먹기가 그래서 아래처럼 유추해 보았다.


bin/cloud9.sh에서는 bin/cloud9.js를 호출한다.

cloud9.js 42line에서 require('cloud9')을 하면 bin/cloud9.js를 찾거나, bin/cloud9/index.js를 찾을 것이다. (nodejs document참조)


- bin/cloud9.js라면, 현재 실행되는 자신일텐데 (기동파일에서 재귀라니.. 이상하다.) bin/cloud9.js에는 exprot.main이 없다.

- bin/cloud9/index.js를 찾는 경우라면, bin/cloud9 폴더가 없다.


find로 cloud9.js를 찾으면 bin/cloud9.js 하나 밖에 없다. 어딘가에 있는 cloud9/index.js에서 exports.main하고 있다는 거다.

index.js로 찾으면, server/cloud9/index.js가 나온다. 다른 index.js도 있지만 cloud9/index.js는 이거 하나밖에 없다.

grep으로 exports.main을 찾으면 server/cloud9/index.js 하나만 나온다.


그래서, require("../server/cloud9").main(options); 로 바꾸고 bin/cloud9.sh을 실행하면 3000번 포트로 잘 올라온다. 올라오면서 기본브라우저인 사파리가 열리면서 'http://127.0.0.1:3000/'을 열어준다.


첨에는 하얗게 아무 것도 안 뜨길래 뜨악했는데 firefox로 다시 열어보니 잘 열린다.

safari에서 css관련 issue가 있던 것 같다.


- 오늘 열어보니 safari에서도 잘 뜬다. 좀 전에  update 하나 떠서 적용했는데 그 영향일까?

,
html/css/javascript 2011. 1. 24. 12:23

[socket IO]

socket io는 serverside js 중 하나이다. 모든 브라우저와 모바일 기기에서 real time 서비스 지원을 목표로 한다. 아래와 같은 동일한 코드를 통해, 각각 다른 브라우저나 장비마다 사용 가능한 기술들을 이용하여 서비스를 구현해 준다.

var socket = new io.Socket(); 
socket.on('connect', function(){ 
  socket.send('hi!'); 
}) 
socket.on('message', function(data){ 
  alert(data);
})
socket.on('disconnect', function(){})

commonjs의 spec을 따르고 있고, nodejs와 잘 어울린다.

링크에 나와 있는대로 설치해 보자.

npm과 git를 이용한 내려받기가 가능한데, git를 이용해서 설치했다.

git clone git://github.com/LearnBoost/Socket.IO-node.git 

~/Socket.IO-node 폴더가 생기면 ~/Socket.IO-node/example/ 폴더로 이동한 후, node를 이용하여 server.js를 실행해 보자. (nodejs가 설치되어 있지 않다면 이전 글 참조.)

> node server.js


위와 같은 화면이 보이고, chart를 클릭하면, 


chatting 화면으로 이동된다. 실제 server의 log를 보면 아래와 같다.


위쪽의 websocket 2개는 각각 safari, chrome 브라우저로 접속했을 때이고, flaoshsocket 2개는 각각 IE8, Firefox로 접속했을 때이다. xhr-polling은 opera 브라우저로 접속했을 때이다.

위에서 보는 바와 같이 socketio는 사용 가능한 기술을 이용하여 real time 서비스를 제공해 준다.



,
html/css/javascript 2011. 1. 20. 14:29

[nodejs] - install

nodejs를 설치해 보자.

이곳에 build 정보가 있다. window환경의 installer는 없고, Cygwin을 설치한 후 build해야 한다.
여기를 참조하여 Cygwin과 nodejs를 설치하자.

Cygwin을 설치할 때는 아래 module들만 설치했다.

devel > gcc-g++
devel > git
devel > make
devel > openssl
libs > openssl-devel
devel > pkg-config
devel > zlib-devel
python > python
web > curl
editors > vim

curl과 vim은 굳이 설치하지 않아도 된다.

cygwin 설치가 끝나면 nodejs를 다운받아 설치해 보자.
링크된 문서에 나와있는 대로 진행한다.

$ cd ~$ git clone git://github.com/ry/node.git$ cd node$ git fetch --all# if the above fails complaining --all is not recognised, try: git fetch origin$ git tag$ git checkout [latest stable tag from previous command, e.g., v0.2.5]$ ./configure$ make$ make install

[git tag]를 하면 down 받을 수 있는 버전이 주욱 나열된다. lastest stable tag를 골라서 checkout하라고 하는데, 최신버전인 v3.0.5로 다운받아 make했을 때 libv8관련 부분에서 fail이 났다.
예시에 나온 대로 v0.2.5로 하면 문제없이 이 후 과정이 진행되었다.

설치가 끝나면 /home/[USER]/node 폴더 안에 node.js 관련 파일들이 다운된다.
샘플 파일을 만들어 테스트해 보자.

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(8124, "127.0.0.1");
console.log('Server running at http://127.0.0.1:8124/');

위와 같은 내용으로 example.js 파일을 만들어 /home/[USER]/node/example.js와 같이 에 위치시키고, 

>cd ~/node
> node example.js &

로 실행시키자.

브라우저를 열어 "http://127.0.0.1:8124" 로 접근하면 "Hello World" 를 볼 수 있다.
,
html/css/javascript 2010. 10. 18. 10:46

node.js

node.js는 V8엔진 기반에서 작동하는 SSJS(server side javascript)이다.
server side script 언어의 대표적인 것은 php일 것이다. APM기반으로 많이 사용하고 있으며 빠른 실행속도와 제공되는 수많은 함수들, 확장 모듈들이 장점이다.

굳이 node.js가 거론되는 이유가 뭘까?

간략히 정리해 보면, 
static html을 apache, apache+php, nodejs(V8)에서 부하를 주어 돌렸을 때, nodejs의 성능이 월등하다. 
글쓴이는 웹서버(apache)가 request를 처리하는 방식에서 근본적인  차이가 있는 것으로 해석한다.

웹서버는 request를 처리하기 위한 thread나 process들의 pool을 운영하여 request를 처리하는데, 
nodejs(V8)은 event loop를 돌리는 thread 하나만 있고, event에 대한 callback을 처리하는 방식으로 request를 처리한다. 별도의 thread들을 생성하고 처리하는 방식보다 event - callback 방식이 heap allocation도 적고, 메모리 사용량도 적다는 것이다. 

동접 처리에 있어서도 nodejs가 php보다 월등히 나은 성능을 보여준다.
글쓴이는 이를 V8의 property 처리 방식에서 기인하는 것으로 본다. 
일반적인 script언어에서의 property는 hash style의 key-value 구조로 저장되는데 V8은 class구조로 구현했고 hash처럼 두 단계를 거치지 않고 바로 접근할 수 있게 되었다는 것이다.

이처럼, nodejs의 장점은 빠르고, 동접 처리에 강하며, server-client간 같은 언어로 프로그램을 작성할 수 있다는 것이다. 
단점은 시작하는 시점이라 지원이 약하고, 사용자층이 적다는 것이다. 지금 당장 nodejs를 이용해서 상업적인 서비스를 제공하기에는 무리가 있을 것 같다.


# 지원
Express - nodejs library







,
html/css/javascript 2010. 9. 14. 10:50

MutationEvent

초기의 html에서는  event와 event가 일어날 수 있는 요소가 제한적이었다. 즉, 몇몇의 event만이 정해진 요소상에서만 발생되하였다.
현재의 html 환경에서는 event 종류가 많이 늘어났으며 event와 요소(element)상의 관계도 없어졌다.

MutationEvent는 html document의 Dom 구조에 변경이 일어났을 때 발생하는 event이다.
 Event  Description
 DomAttrModified  요소의 값이 변경되었을 때 발생.
eventHandler에서는 요소이름, 변경전값, 변경후값을 받을 수 있다.
 DomNodeInserted  요소가 추가되었을 때 발생.
 DomNodeRemoved  요소가 삭제되었을 때 발생.




,
html/css/javascript 2010. 9. 1. 10:34

SVG library

SVG를 지원하는 library들 모음

version 1.5 released.

flash를 쓸 수 있는 것 같다..
ajaxian에 소개글이 올라왔는데 재미있다. 시간날 때 읽어보자.

browser상에서 SVG를 이용하여 구현된, 목업같은 것을 그릴 수 있는 editor.

java에서 SVG를 사용하기 위한 접근.
eclipse plugin도 있다.

cf) 브라우저별 SVG 구현도
> W3G recommandation에 올라온 게 2003.01.13 이라고 한다. 여기에서 브라우저별 SVG 구현 정도를 도표로 볼 수 있다. 여기에 있는 W3G의 SVG Test suit를 통해 측정하였다.


,
html/css/javascript 2010. 2. 4. 11:14

rich text editor

흔히 웹에디터라고도 하는  rich text editor.
찾아보니 굉장히 많다. (참조사이트에서 20가지를 소개하고 있다.)

사실, rich text editor는 불편하다. user는 보이는 ui만으로, standalone application(MS Word 같은)수준을 기대하지만 웹에서 그렇게 구현하기에는 css,javascript의 기술적 한계가 있다. 브라우저의 지원이 필요하다.

구현하거나 사용할 때는 저장, 한글, 되돌리기/원복하기, 문단 및 개행(엔터)처리, html 코딩, 미리보기, 본문이 html일 경우 css적용 등, 고려할 사항이 많다.

rich text editor와 같이 많이 사용하는 widget성의 모듈은 브라우저 벤더에서 지원해 주었으면 하는 바램이다.
web widget들이 구현하고 있는 기능들은 거의 동일하기 때문에 표준화도 가능할 것 같다.
브라우저에서 자체 지원을 한다면 css와 javascript들로 범벅이 되어, 파싱에 많은 자원을 소비하고 있는 지금 widget들보다 수행 성능도 월등히 좋아지지 않을까.

어느 브라우저 벤더가 open source의 형식으로 먼저 제시하고, 수많은 개발자들이 참여하고 참조해서 canvas나 video tag같이 표준이 되었으면 하는 바램이다.


[참조] 신현석님 blog
          geniisoft - WYSIWIG Web Editor
,
TOTAL TODAY