读《js高级程序设计》问题?

发布于 2022-09-07 19:57:25 字数 549 浏览 18 评论 0

第六章:在创建对象的方式中有这样一种动态原型模式

function Persion() {
    this.name="wyq";
    this.friends=["a", "b", "c"];
    //下面的代码有什么意义??? 每次new一个对象的时候肯定要执行里面的函数啊
    if(typeof this.sayName !=="function"){
        this.sayName = function () {
            console.log("friends",this.friends);
        }
    }
}

直接这样写不就好了吗?

function Persion() {
    this.name="wyq";
    this.friends=["a", "b", "c"];
}
Persion.prototype = {
    sayName: function () {
        console.log("this.name", this.name);
    },
};

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

彩扇题诗 2022-09-14 19:57:25

一段代码的作用要看使用环境,一个功能的实现可能有很多种写法

下面的写法是我们最常见也是最常用的,那么上面的代码和下面的代码有什么区别呢?

区别就是上面的代码,sayName属性是作用在子对象上的,而下面的代码是作用在父对象上的

上面的代码如果修改一下

function Persion(hasSayName) {
    //...
    if(hasSayName && typeof this.sayName !=="function"){
        //...
    }
}
var p1 = new Persion
var p2 = new Persion(true)

这样,代码的用意就特别清晰了

生生漫 2022-09-14 19:57:25

其实呢,双方的目的就是创建个对象后,实例拥有sayName()的能力

区别在哪里呢:
这种方式创建的sayName是在new Persion实例后,在实例上创建的

function Persion() {
    this.name="wyq";
    this.friends=["a", "b", "c"];
    //下面的代码有什么意义??? 每次new一个对象的时候肯定要执行里面的函数啊
    if(typeof this.sayName !=="function"){
        this.sayName = function () {
            console.log("friends",this.friends);
        }
    }
}

这种方式创建的sayName是在Persion构造函数上直接创建的

function Persion() {
    this.name="wyq";
    this.friends=["a", "b", "c"];
}
Persion.prototype = {
    sayName: function () {
        console.log("this.name", this.name);
    },
};

总结一下:一个在实例上创建,一个在构造函数上创建

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文