zoukankan      html  css  js  c++  java
  • javascript 容易忽略的小知识点 new到底做了什么?

    问题:平时我们经常写 var ss = new Person();ss就是一个由’Person类‘生成的对象了,可是我们的Person方法里却没有写 return;

    (var ss= Person(); 返回的是undefined  因为 方法内没有写return)

    先来一段普通代码

     function Person( name ){
            this.name = name;
            //return this;
        };
        Person.prototype.getName = function(){
            return this.name;
        };
    
        var ss= new Person(22);
        console.log( ss );

    地球人都知道  打印结果是  

    接下来第二种情况

    var obj= new Object();
    
     function Person( name ){
            this.name = name;
            return this;
        };
        Person.prototype.getName = function(){
            return this.name;
        };
    
        var ss= Person.apply(obj);
        console.log( ss );

     打印结果是 

    你可能也觉得这很正常,接下来请看

    var obj= new Object();
    
     function Person( name ){
            this.name = name;
           // return this;
        };
        Person.prototype.getName = function(){
            return this.name;
        };
    
        var ss= Person.apply(obj);
        console.log( ss );

     打印结果是--undefined 

    由此 我们可以得出结论:

    1 javascript  没有类的概念, 一定要切记,不要受其他基于类的语言影响(如java),认为对象一定是由类创建来的,函数是一等对象

    2 new 关键字 我们可以认为做了以下几件事情

        var ss = (function(Person){
            var obj = new Object();//new 一个object对象--才发现这里也用到了new……这个怎么解释……靠 我还木有研究啊
            obj.__proto__ = Person.prototype;//对象的原型指向Person的原型
            var ret = Constructor.apply( obj, arguments );//this--指向obj
            return typeof ret === 'object' ? ret : obj;//如果Person函数有return则返回ret,否则返回obj
    
        })(Person)

     补充: 对象字面量是不能直接找自己的原型的,它必须委托给它的构造器 ,然后构造器去找它的原型

  • 相关阅读:
    JavaScript基础
    Dao的扩展
    错题解析
    实现windows程序的数据绑定
    C#第三章
    第二章
    初始windows程序
    使用ADO.NET查询和操作数据
    使用ADO.NET访问数据库
    4.计算机层次与编程语言
  • 原文地址:https://www.cnblogs.com/WhiteHorseIsNotHorse/p/6250469.html
Copyright © 2011-2022 走看看