var A = {n:4399}; var B = function(){this.n = 9999}; var C = function(){var n = 8888}; B.prototype = A; C.prototype = A; var b = new B(); var c = new C(); A.n++; console.log(b.n); console.log(c.n);
以上代码,在浏览器中执行的结果是
var A={n:4399}; var B=function(){ this.n=9999 } var C=function(){ var n=8888 } B.prototype=A; C.prototype=A; var b=new B(); var c=new C(); A.n++; console.log(b.n); console.log(c.n);
var A = {n:4399}; //A是一个对象 var B = function(){this.n = 9999}; //B是一个构造函数,这个函数里有一个属性n,因为用了this.n var C = function(){var n = 8888}; //C是一个构造函数,这个函数里只是定义了一个局部变量n, //这个局部变量n并不属于函数自身的属性 B.prototype = A; //prototype是原型,原型的本质也是一个对象。 //现在让B的原型对象指向了A这个对象。此时B的原型对象就是对象A。 C.prototype = A; //prototype是原型,原型的本质也是一个对象。 //现在让C的原型对象指向了A这个对象。此时C的原型对象也是对象A。 var b = new B(); //通过new关键字创建了一个实例化对象b, 注意b的本质是一个对象。 //构造函数的属性都是这个对象的属性。 //因为构造函数B里有一个属性n,故此时 b = {n:9999} var c = new C(); //通过new关键字创建了一个实例化对象c,注意c的本质是一个对象。 //构造函数的属性都是这个对象的属性。 //因为构造函数C里没有任何属性,古此时 c = {} A.n++; console.log(b.n); //b.n 首先会去b对象里找n,b对象里如果有n就直接获取, //如果没有就去 b对象的构造函数的原型对象 里找 //因为b = {n:9999},所以b对象是有属性n的,故直接获取b.n = 9999 console.log(c.n); //c.n 首先会去c对象里找n,c对象里如果有n就直接获取, //如果没有就去 c对象的构造函数的原型对象 里找 //因为c = {},所以c对象没有属性n, //只能去 c对象的构造函数的原型对象(也就是A={n:4399})里找 //而倒数第三行执行了 A.n++; 故 A.n的值变成了4400, 所以c.n就是4400
let F = function(){ let num1 = 1; this.num2 = 2; } let f = new F(); console.log(f); // F {num2: 2} // 这里控制台的输出找不到num1的半点影子可以比作c语言中的类, F就是一个类, function(){let num1.........}等是他的构造函数
var A = {n:4399}; var B = function(){this.n = 9999;} var C = function(){var n = 88888;} var b = new B(); var c = new C(); console.log(b.n); //9999 console.log(c.n); //unsigned(在c的对象上没有属性n)
var A = {n:4399};
var B = function(){this.n = 9999;} var C = function(){var n = 88888;} *2 C.prototype = A; var b = new B(); var c = new C(); console.log(b.n); //9999 console.log(c.n); //43999((在c的对象上没有属性n,但是c的原型上有)
var A = {n:4399};
var B = function(){this.n = 9999;} var C = function(){var n = 88888;} *3 B.prototype = A; *2 C.prototype = A;
var b = new B();
var c = new C();
console.log(b.n); //9999(b的原型链上A的的对象上有,但是在b的对象上有属性n) console.log(c.n); //43999(在c的对象上没有属性n,但是c的原型链上A的的对象上有)
var A = {n:4399}; var B = function(){this.n = 9999;} var C = function(){var n = 88888;} *3 B.prototype = A; *2 C.prototype = A; var b = new B(); var c = new C();
*4 A.n++;console.log(b.n); //9999(b的原型链上A的的对象上有,但是在b的对象上有属性n) console.log(c.n); //43999(在c的对象上没有属性n,但是c的原型链上A的的对象上有,同时a的属性n改变了)