日期:2014-05-16  浏览次数:21485 次

使人头晕向转的 prototype!
请到下面看!
 ||
 ||
 ||
 ||
____
\ /
 \/


------解决方案--------------------
试解:prototype称为原型,类的每个对象都有对它的可读性,描述不来……还是用代码描述
JScript code

function show(s) {
    document.write(s + "<br/>");
}
//定义一个类型 ClassA,
function ClassA() {
    this.a=[];
}
//定义一个类型 ClassB
function ClassB() {
    this.b = function() { alert("ClassB");};
}
//ClassB 以 ClassA 的对象为原型
ClassB.prototype = new ClassA();
//创建两个 ClassB 类型的对象
var ojb1 = new ClassB();
var ojb2 = new ClassB();

------解决方案--------------------
不等价,一种是给ojb1创建属性并赋值。上面原型的方式是通过原型链查找到的属性a,并没有给ojb1添加属性。
而如果直接ojb1.a="高手" 这样做的话他不是给原型链找到的值赋值,而是新建一个属性给ojb1。从而查找的时候直接找到这个对象的a,相当于覆盖了原型链的a。
至于什么是原型和原型链,请看看下面
http://www.csser.com/dev/52.html
------解决方案--------------------
我说说我的理解吧
准备几个概念,引用类型值和原始类型值
我们知道var i = 1;申明的是变量i,且其值为原始值1,而var i = {}申明的是值为{}的引用对象,即i中存储的是{}对象的内存地址的指针引用。
那么我们再来看上面的代码:
JScript code


function show(s) {
    document.write(s + "<br/>");
}
//定义一个类型 ClassA,
function ClassA() {
    this.a=[];
}
//定义一个类型 ClassB
function ClassB() {
    this.b = function() { alert("ClassB");};
}
//ClassB 以 ClassA 的对象为原型
ClassB.prototype = new ClassA();
//创建两个 ClassB 类型的对象
var ojb1 = new ClassB();
var ojb2 = new ClassB();
//
ojb1.a.push("牛","人");//调用数组的原型方法
show(ojb2.a);

------解决方案--------------------
弄清楚基本类型的值传递和对象的引用传递,你就觉得你的问题不再是问题了。。
------解决方案--------------------
3楼的问题,当a为数组时,它在原型中存放的是数组的内存地址。而当你根据原型链给他改变时,数组指向的内容改变了,而地址并没有改变!所以根据ojb1和ojb2获取出来的内容一样,就像类C语言函数中你传入值类型和存入地址(或叫引用类型)的区别一样。
------解决方案--------------------
不好意思,之前看错了。
valueOf方法是Object的prototype方法。而你用in来查找会检索原型链中所有的属性(Site的Prototype最终也指向Object的prototype),直到最顶层,亦即是Object的prototype(所有类型的prototype最终指向Object的prototype)。

而你上面for循环只是遍历Site的prototype,而没有进行原型链上的搜索。
你想看更具体的,请看以下文章。
http://www.cnblogs.com/RicCC/archive/2008/02/15/JavaScript-Object-Model-Execution-Model.html
希望对你有帮助

------解决方案--------------------
__proto__属于对象,prototype属于你定义的类型,而你定义的类型又是一个对象,所以你定义的类型既有__proto__,又有prototype。慢慢参详那篇文章吧,不是一两次能看懂的。
------解决方案--------------------
JScript code
<script type="text/javascript">
function show(s) {
    document.write(s + "<br/>");
}
//定义一个类型 ClassA,
function ClassA() {
    this.a=[];
}
//定义一个类型 ClassB
function ClassB() {
    this.b = function() { alert("ClassB");};
    //加上这一行代码
    ClassA.call(this);
}
//ClassB 以 ClassA 的对象为原型
ClassB.prototype = new ClassA();
//创建两个 ClassB 类型的对象
var ojb1 = new ClassB();
var ojb2 = new ClassB();
//
ojb1.a.push("牛","人");
show("ojb2中a的值:"+ojb2.a);
show("ojb1中a的值:"+ojb1.a);
</script>

------解决方案--------------------
居然还在纠结,你的问题在于对象的引用传递问题,并非在prototype上面,当然你得先清楚prototype的原理才会知道这问题是在于对象的传递上。。关于prototype的原理网上一搜一大箩,自己google吧。。
值传递的问题,我举个最简单的例子
JScript code
            var arr = [],
                a = arr,
                b = arr;
            a.push('a_push');
            alert(b);

------解决方案--------------------
__proto__和prototype需要你认真看之前的文章,我觉得我也说得很通俗了。。。
至于 apply 和 call 你可以看看这文章
http://a48121905.blog.163.com/blog/static/187490265201110305295715/