访问原型对象的函数属性时,报该属性‘is not a function’的错误?是new关键字没起实例化作用?

发布于 2022-09-04 07:43:14 字数 1071 浏览 41 评论 0

javascript代码如下:

var A = function() {
    function Person(name) {
        this.name = name;
    }
 
    var m = function() {
        return "Hello " + this.name;
        //return "Hello ";
    };
 
    Person.prototype.getGreeting = m;
    
    return Person;
};
console.dir(A);

//代码1
//结果正常,无报错
//var B=A();
//console.log(new B("AAAA").getGreeting());

//代码2
//报错:1.js:43 Uncaught TypeError: (intermediate value).getGreeting is not a function
console.log(new A().getGreeting());

//代码3
//结果正常,无报错
console.log(new(new A())("AAAA").getGreeting());

//代码4
//结果正常,无报错
console.log(new(A())("AAAA").getGreeting());

调试过程中,发现报错部分(即代码2)中new A()对象的原型prototype其实是包含有getGreeting这个属性值的。对以上代码有如下几个疑问:
1.new A()生成的是什么?希望可以从深层次解答。
2.new A()生成的对象和new(new A())("AAAA")生成对象的区别?
3.代码1和代码3可看出new A()A()貌似没有什么区别,为什么?
4.问题3new A()A()如果确实是没区别的话,那就是new关键字没有起实例化作用,这该怎么理解?

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

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

发布评论

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

评论(1

剩余の解释 2022-09-11 07:43:14

1、由于你return的并不是this这个实例。所以你的new A()和A()结果一样。没有什么深层次,本来new 通过构造函数创建了一个实例this,默认返回的就是它,但这个返回值被你给篡改成了Person这个函数对象,就这么简单。

2、通过1知道了new A()Person这个函数,然后new(new A())("AAAA")简化一下,就是new (A())('aaaa'),也就是new Person('aaaa');这差别就很明显了吧,一个是构造函数,一个构造函数的实例。

3、同1的解释,this的指向问题。

4、this指向。

补充一点:
https://developer.mozilla.org...

当代码 new foo(...) 执行时:

  1. 一个新对象被创建。它继承自foo.prototype.

  2. 构造函数 foo 被执行。执行的时候,相应的传参会被传入,同时上下文(this)会被指定为这个新实例。new foo 等同于 new foo(),只能用在不传递任何参数的情况。

  3. 如果构造函数返回了一个“对象”,那么这个对象会取代整个new出来的结果。如果构造函数没有返回对象,那么new出来的结果为步骤1创建的对象,ps:一般情况下构造函数不返回任何值,不过用户如果想覆盖这个返回值,可以自己选择返回一个普通对象来覆盖。当然,返回数组也会覆盖,因为数组也是对象。

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