2012-08-14 2 views
3

아래 코드를 실행하면 콘솔에 object is not a function 오류가 표시됩니다. 이 오류는 내 script.js 파일의 var todo = new Todo('contents');에 있습니다. 어떻게 작동시킬 수 있습니까? 여기javascript : object의 오류가 함수가 아닙니다.

내 todo.js 내 script.js 여기

$(function() { 
var todo = new Todo('contents'); 

$('.addBtn').on('click', function() { 
    var name = $(this).parent().find('input[type="text"]').val(); 
    todo.add(name); 
}); 

$('.contents').on('click', '.remove', function() { 
    var el = $(this).parent(); 
    todo.remove(el); 
}); 

$('.contents').on('click', '.update', function() { 
    var dom = $(this); 
    todo.addUpdateField(dom); 
}); 

$('.contents').on('click', '.updateBtn', function() { 
    var el = $(this); 
    todo.update(el); 
}); 

}); 

파일 여기에

var Todo = (function(c) { 
var contents = $('.' + c); 

var showel = function (d) { 
    contents.prepend(d); 
}, 

add = function (name) { 
    if(name != "") { 
     var div = $('<div class="names"></div>') 
     .append('<span>' + name + '</span>') 
     .append("<button class='update' class='update'>Edit</button>") 
     .append("<button class='remove' name='remove'>Remove</button>"); 
    } 

    return showel(div); 
}, 

addUpdateField = function (dom) { 
    var name = dom.parent().find('span').text(), 
     field = $('<input type="text" value="' + name + '" />'), 
     update = $('<button class="updateBtn">Update</button>'); 
    dom.parent().html('').append(field).append(update); 

    return; 
}, 

update = function(el) { 
    var val = el.parent().find('input').val(); 
    el.parent().html('<span>' + val + '</span>') 
    .append('<button class="update" class="update">Edit</button>') 
    .append('<button class="remove" class="remove">Remove</button>'); 

    return; 
}, 

remove = function (el) { 
    return el.remove(); 
}; 

return { 
    add    : add, 
    update   : update, 
    remove   : remove, 
    addUpdateField : addUpdateField 
}; 
})(); 

파일되어 HTML 코드를 즉시 실행을하는

<html> 
<head> 
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"> </script> 
<script type="text/javascript" src="todo.js"></script> 
<script type="text/javascript" src="script.js"></script> 
<link rel="stylesheet" type="text/css" href="styles.css"> 
<title></title> 
</head> 

<body> 
<div class="container"> 
    <label>Name</label> 
    <input type="text" class="name" name="name" /> 
    <input type="button" class="addBtn" name="add" value="Add" /> 
    <div class="contents"></div> 
</div> 
</body> 
</html> 
+0

당신의 HTML 파일을주세요 –

+0

나는 ASEF를 보통 함수로 바꾸어야한다고 생각합니다. –

+0

ASEF는 무엇을 의미합니까? – 2619

답변

9

입니다 함수는 Todo에 할당됩니다. 이 함수는 객체를 반환하므로 Todo은 함수가 아니라 반환 된 객체를 참조합니다 (따라서 "함수가 아닙니다"오류).

var Todo = function() { 

    this.add = function() { //Note the use of `this` here 
     //Do stuff 
    }; 
    //etc... 

}; //No self-invoking parentheses here 

이제 Todo가 현재 수행하려는 된대로 new 연산자를 호출 할 수있는 생성자 함수를 참조 :

난 당신이의 라인을 따라 뭔가 의도 가정합니다.

또한이 패턴은 매번 Todo의 인스턴스에 각 메서드의 복사본이 있으므로 매우 효율적이지 않습니다. prototype의 속성으로 메소드를 선언하는 더 나은 것 :

var Todo = function() { 
    //Initialize the Todo instance 
}; 
Todo.prototype.add = function() { 
    //Do stuff 
}; 

이제 Todo의 모든 인스턴스 방법 중 하나의 사본을 공유합니다.

+0

이렇게 작동합니다. 하지만 위의 예제에서 수행하려는 방식대로 작동하도록 코드를 수정하고 싶습니다. 어떻게 작동하도록 코드를 수정할 수 있습니까? – 2619

+0

나는 당신이 성취하려고하는 것을 얻지 못한다. –

+0

나는이 자바 스크립트를 배우고있다. – 2619

관련 문제