js 原型,实例的理解

// 我讲得好啰嗦..
function obj(name){
    if(name){
        this.name = name;
    }
    return this;
}
obj.prototype.name = "name2";
var a = obj("name1");
var b = new obj;
 
console.log(a.name); // name1
console.log(window.name); // name1
console.log(b.name); // name2
 
//一般函数直接调用,默认this执行全局window|global
//通过obj('name1')调用,返回this引用,并传给a, 此时a等于window对象,即可输出属性name值
 
//new操作, new obj 等价于 new obj() ,实例化一个对象,这时this指向obj,要拿到b.name的值
//需要保证name属性存在,属性查找原则是先查找当前实例有没有属性,如果有就直接使用,如果没有就到原型上面找,再没有就接着原型链一步一步,这里为了和a.name作属性区别,使用了if(name)有条件地构建this的属性name
//所以,现在实例name属性提供给a使用,原型上的name提供给b使用。
 
//两个变体
function obj(name){
    //if(name){
        this.name = name;
    //}
    return this;
}
obj.prototype.name = "name2";
var a = obj("name1");
var b = new obj;
 
console.log(a.name);//name1
console.log(window.name);//name1
console.log(b.name);//undefined
// 这时b实例已经有属性name,但参数name为undefined ,所以
// 这时可以把,this.name属性删掉,这样就能去原型找name了
function obj(name){
    //if(name){
        this.name = name;
    //}
    return this;
}
obj.prototype.name = "name2";
var a = obj("name1");
var b = new obj;
 
console.log(a.name);//name1
console.log(window.name);//name1
delete b.name;
console.log(b.name);//name2
 
 
// 再试试 new obj('myName') 传个参数
function obj(name){
    //if(name){
        this.name = name;
    //}
    return this;
}
obj.prototype.name = "name2";
var a = obj("name1");
var b = new obj('myName');
 
console.log(a.name);//name1
console.log(window.name);//name1
console.log(b.name);//myName


//以上参考牛客网@imwtr的答案,转到自己博客主要目的方便自己对一些知识点的整理<h3 class="side-profile-name level-color-7">
<span class="sex-ico male-ico" title="男"></span></h3>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值