我一直无法理解js中 function test(){ this.a=function(){ return ""; } } test.prototype.a=function(){ return ""; }; var test={ a:function(){ reurn ""; }; }; 他们的本质区别
一个是函数对象,一个是普通对象,怎么会没区别?this.a; test.prototype.a; var test={ a: ?
一个是函数对象,一个是普通对象,怎么会没区别?this.a; test.prototype.a; var test={ a: ? Let me show you some magic: function base () { } test.prototype.a = function () {return "";} function extended () {} extended.prototype = new base(); var extObj1 = new extended(); var extObj2 = new extended();alert (extObj1.a()); // "" extObj1.a = function() { return "haha";} alert (extObj1.a()); // "haha"// here is the magic part base.prototype.a = function() {return "hey, here is the magic!";} alert(extObj2.a()); // "hey, here is the magic!" alert(extObj1.a()); // "haha"简单来说,新建对象的属性是prototype的属性的引用,改变了prototype对象,新建的对象也被改变,并且这种改变是可传递的。如果是function test() { this.a = function() {return "";} } 你就没有这种改变prototype的属性就影响到所有实例对象的便利了好啦好啦我知道这里是JavaSE板
一个是函数对象,一个是普通对象,怎么会没区别?this.a; test.prototype.a; var test={ a: ? Let me show you some magic: function base () { } test.prototype.a = function () {return "";} function extended () {} extended.prototype = new base(); var extObj1 = new extended(); var extObj2 = new extended();alert (extObj1.a()); // "" extObj1.a = function() { return "haha";} alert (extObj1.a()); // "haha"// here is the magic part base.prototype.a = function() {return "hey, here is the magic!";} alert(extObj2.a()); // "hey, here is the magic!" alert(extObj1.a()); // "haha"简单来说,新建对象的属性是prototype的属性的引用,改变了prototype对象,新建的对象也被改变,并且这种改变是可传递的。如果是function test() { this.a = function() {return "";} } 你就没有这种改变prototype的属性就影响到所有实例对象的便利了好啦好啦我知道这里是JavaSE板 貌似是这么这道理,谢了
Thinking In Java 那本书本身的问题以及读者不求甚解的原因,也带了不少混乱。Thinking in java 这本书确实讲的比较深奥
1 过度使用单例会给代码的可维护性带来毁灭性打击。实际情况是单例应该尽量避免而不是提倡
2 静态变量可以节省内存,当用则用。另外b = null不就好了什么生命周期与A同步啊
3 创建对象有时候是为了代码书写方便,有时候是为了保证类的immutability。而且JVM见到new的时候并不一定会创建对象
4 尽量用final并不是为了性能,而且事实上即便是最简单的final方法编译器也不会内联。final String是因为String是一个特殊而且重要的对象,不应该改变它的行为
5 局部变量当用则用
6 synchronize方法应该用一个锁对象代替,不只是缩小
13 那不是重复计算
public int size() {
return size;
}
14 这看上去是不必要的创建,而事实上如果A是一个简单的对象(默认构造函数),单纯new A();并不会创建它
20 用二维数组是因为有用,而不是因为我想写一个烂代码
26 异常也是当用则用。要注意的是异常只能拿来处理真的异常,而不是正常的业务逻辑中的条件分支
1.用15年前的眼光看java。
2.用所谓“性能”为出发点影响设计。
3.光说不profiling。
1.用15年前的眼光看java。
2.用所谓“性能”为出发点影响设计。
3.光说不profiling。
学习了学习了~
话说“栈有一个很重要的特殊性,就是存在栈中的数据可以共享”是最有创造性的理论发明了,如果这些人能创造性地发明一个实现该理论的jvm就更好了。
至于this和super,他们很多时候根据自己的理解来判断,这本身没什么错,但是他们仅仅只是去判断而不去验证,因此得出错误的结论,这样也就罢了,还发出来让人嘲笑,实在是不应该。
顶楼主,有一次同事摘抄了网上的一些性能优化的文章给我看,只看了一眼,就发现一条:
尽量少使用枚举类型,因为它比起int常量会占据很多内存。怎么跟同事解释这玩意呢,单纯的内存占用确实是比基本类型要多,无奈翻出<Effective java>一书,翻出其中的一些建议才说服了同事,最终还发现那篇文章很多观点和Effective java中是相反的。
function test(){
this.a=function(){
return "";
}
}
test.prototype.a=function(){
return "";
};
var test={
a:function(){
reurn "";
};
};
他们的本质区别
test.prototype.a;
var test={
a:
?
test.prototype.a;
var test={
a:
?
Let me show you some magic:
function base () { }
test.prototype.a = function () {return "";}
function extended () {}
extended.prototype = new base();
var extObj1 = new extended();
var extObj2 = new extended();alert (extObj1.a()); // ""
extObj1.a = function() { return "haha";}
alert (extObj1.a()); // "haha"// here is the magic part
base.prototype.a = function() {return "hey, here is the magic!";}
alert(extObj2.a()); // "hey, here is the magic!"
alert(extObj1.a()); // "haha"简单来说,新建对象的属性是prototype的属性的引用,改变了prototype对象,新建的对象也被改变,并且这种改变是可传递的。如果是function test() {
this.a = function() {return "";}
}
你就没有这种改变prototype的属性就影响到所有实例对象的便利了好啦好啦我知道这里是JavaSE板
test.prototype.a;
var test={
a:
?
Let me show you some magic:
function base () { }
test.prototype.a = function () {return "";}
function extended () {}
extended.prototype = new base();
var extObj1 = new extended();
var extObj2 = new extended();alert (extObj1.a()); // ""
extObj1.a = function() { return "haha";}
alert (extObj1.a()); // "haha"// here is the magic part
base.prototype.a = function() {return "hey, here is the magic!";}
alert(extObj2.a()); // "hey, here is the magic!"
alert(extObj1.a()); // "haha"简单来说,新建对象的属性是prototype的属性的引用,改变了prototype对象,新建的对象也被改变,并且这种改变是可传递的。如果是function test() {
this.a = function() {return "";}
}
你就没有这种改变prototype的属性就影响到所有实例对象的便利了好啦好啦我知道这里是JavaSE板
貌似是这么这道理,谢了