我创建了两个课程,即人员 - 父课程和学生课程 - 儿童课程。我正在尝试实现继承。我也试图以模块化模式实现它。但它没有得到正确的。对于代码块,请在下面查看。
Person.js
var Person = function() {
var details, constructor, getDetailsByAttribute, setDetailsByAttribute, setDetails, getDetails, clearDetails;
clearDetails = function() {
details = {
uid : '',
name : '',
email : ''
};
};
getDetailsByAttribute = function(attr) {
return details[attr];
};
setDetailsByAttribute = function(key, value) {
if(details.hasOwnProperty(key)) {
details[key] = value;
}else {
console.log('invalid key');
}
};
setDetails = function(param) {
clearDetails();
for(var attr in param) {
if(details.hasOwnProperty(attr)) {
details[attr] = param[attr];
}
}
};
getDetails = function() {
return details;
};
/**
* During object creation;
*/
if(arguments.length >= 1) {
//clearDetails();
setDetails(arguments[0]);
}
return {
getDetailsByAttribute : function(attr) {
return getDetailsByAttribute(attr);
},
setDetailsByAttribute : function(key, value) {
setDetailsByAttribute(key, value);
},
setDetails : function(params) {
setDetails(params);
},
getDetails : function() {
return getDetails();
},
clearDetails : function() {
clearDetails();
}
};
};
Student.js
var Student = function() {
Person.call(this,arguments);
};
Student.prototype = new Person();
的index.html
<html>
<head>
</head>
<body>
<script type="text/javascript" src="modules/Person.js"></script>
<script type="text/javascript" src="modules/Student.js"></script>
<script type="text/javascript">
var person1, person2, person3, student1;
person1 = new Person({
uid : 5225,
name : 'jaison',
email : 'jaison@jaison.com'
});
person2 = new Person({
uid : 5222,
name : 'jatin',
email : 'jatin@jatin.com'
});
person3 = new Person();
person3.setDetails({
uid : 5221,
name : 'sarath',
email : 'sarath@sarath.com'
});
person3.setDetailsByAttribute('name', 'sarath');
student1 = new Student({
uid : 5221,
name : 'sachin',
email : 'sachin@sachin.com'
});
console.log('person 1 : ',person1.getDetails());
console.log('person 2 : ',person2.getDetails());
console.log('person 3 : ',person3.getDetails());
console.log('student 1 : ',student1.getDetails());
//console.log(student1.get);
</script>
</body>
</html>
答案 0 :(得分:2)
试试这个:
var Student = function() {
return Person.apply(this, arguments);
};
无
Student.prototype = new Person();
更新:我只是意识到你可以使用它:
var Student = function() {
this.setDetails.apply(this, arguments);
};
Student.prototype = new Person();
因此闭包将在原型内部,并且setDetails将访问它。
执行此操作时的代码:
Student.prototype = new Person();
你创建了一个闭包,当你调用它时
var Student = function() {
Person.call(this,arguments);
};
你创建了另一个闭包(它不应该被调用但是应用,但即使它不起作用)。你将构造函数作为一个函数执行,并且(如果它将应用它将)将参数应用于不同的闭包,并且在闭包内具有详细信息的Person返回的所有函数将被丢弃。学生的方法将取自原型而非建造者。
答案 1 :(得分:1)
问题是details
是原型中的局部变量和Person.apply
调用中的局部变量。这些是不同的。我的建议是将details
附加到对象上,即
var Person = function() {
var self = this;
self.details = null;
// the other code goes here;
clearDetails = function() {
self.details = {
uid : '',
name : '',
email : ''
};
};
setDetails = function(param) {
clearDetails();
for(var attr in param) {
if(self.details.hasOwnProperty(attr)) {
self.details[attr] = param[attr];
}
}
};
// and the other code here.
}
基本上将details
更改为self.details
。我没有测试它,但它应该工作。