问个 js 动态原型问题

2016-11-21 22:51:32 +08:00
 yantianqi

方法 1 正常,方法二没有声明 sayName 动态模型不能用字面量是吗?

//方式一
function Person(name){
    this.name = name;

    if(typeof this.sayName != "function") {
        Person.prototype.sayName = function() {
            alert(this.name);
        }
    }
}

var person1 = new Person("xiaoming");
person1.sayName();

//方式二
function Person(name){
    this.name = name;

        if(typeof this.sayName != "function") {
            Person.prototype={    //这里不能用字面量是吗?
                sayName:function() {
                    alert(this.name);
            }
        }
    }
}

var person1 = new Person("xiaoming");
person1.sayName();
1450 次点击
所在节点    程序员
4 条回复
xingo
2016-11-21 23:02:11 +08:00
你在构造时把 Person 原型都替换掉了,那 person1 的原型当然就不是 Person 的实例啦

https://ooo.0o0.ooo/2016/11/21/58330c6c69584.png
aleen42
2016-11-21 23:07:07 +08:00
你这样的话, prototype 的确被替换掉而只剩下 sayName 方法,那么 this.name 应该是 undefined
xingo
2016-11-21 23:25:27 +08:00
@aleen42 不会, sayName 是直接报错, person1 在 new 时进入 constructor 之前,其实例已经创建,之后才把构造函数中的 this 替换成实例进行添加方法和属性,现在是他把 Person 的 prototype 给替换了,那么 person1 的__proto__其实已经不是当时的 Person.prototype ,自然没有 sayName 这个方法
aleen42
2016-11-22 07:44:47 +08:00
@xingo 哦哦 明白

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/322209

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX