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)

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

时间: 2024-12-27 04:09:22

javascript 容易忽略的小知识点 new到底做了什么?的相关文章

html、css容易被忽略的小知识点

都说前端容易,谁说的.前端上手快,越往后学习越困难.学习前端快一年了,依然发现一些小的知识点不会.这些经验性的东西不碰到永远学不会. (1)title前面的logo. 就像这个编辑文章前面的logo.不知道大家知不知道这个图标是如何加载过来的.反正我之前不知道...如果大家知道的话就直接忽视掉我吧.当我自己做笔记了吧. <link rel="shortcut icon" href="./flappyBird/bird.png"/> 这个rel后面要写sh

React之小知识点总结

总结react中常常被忽略的小知识点 1)即使state里设置成和之前的值一样,render也会重新渲染 2)父组件传给子组件的属性(props是只读的,在子组件中已在this.state里将属性赋值给定义的变量),如果属性在父组件中可以操作改变值的话,那么在子组件中就不建议修改,如果属性在父组件不操作,那么在子组件中就可以修改 3)通过bind绑定的函数,收到参数和事件时,事件会在参数后面,示例: <a  onClick={this.handleClick.bind(this, 'click'

私人定制javascript中函数小知识点

函数的定义 首先在javascript中,函数就是对象,程序可以随意操控它们.比如,可以给它们设置属性,甚至调用它们的方法.函数使用function关键字来定义.它既可以用在函数定义表达式,也可以用在函数声明语句中.函数声明function后面必须要更上函数名称也就是所谓的函数名称标识符.如果是函数表达式函数名称标识符可有可无.这段重点是函数是对象,所以函数表现出来的种种行为你想想成对象,那么很多疑惑可能就恍如昨日初见. 函数调用 4种方式来调用javascript函数: 1.作为函数 就是函数

JavaScript 经常忽略的 7 个基础知识点

1. 在 String.prototype.replace 方法中使用 /g 和 /i标志位 令很多 JavaScript 初学者意外的是,字符串的 replace 方法并不会 替换所有匹配的子串——而仅仅替换第一次匹配.当然 JavaScript 老手们都知道这里可以使用正则表达式,并且需要加上一个全局标志位(/g): Javascript代码 // Mistake // 踩到坑了 var str = "David is an Arsenal fan, which means David is

私人定制javascript中数组小知识点(Only For Me)

先上笑话,1.刚看到一个游泳的,想起公司组织去三亚旅游,老板跳海里,各种挣扎,捞上来老板第一句话:我记得我会游泳的啊. 2.媳妇说:老公对不起,我把你新买的自行车撞散架了! 老公:没事宝贝,你若安好,便是晴天! 媳妇说:老公你太有诗意了. 老公:滚犊子,安不好我整死你! 数组的概念 javascript数组是值得有序集合,不过它实属一个javascript对象的特殊形式,这是一个很重点的定性. 创建数组 1.var a=new Array();//等同于[] 2.var a=new Array(

私人定制javascript中对象小知识点(Only For Me)

废话不多讲,先上笑话,然后再,.看懂这个的说明你的节操已经不再了. 晚饭后去理发店理发...割了吧...老板问我怎么剪,我悠悠的来一句往帅了剪...高潮往往令人想不到....旁边一在焗油烫头发的大妈说到 别这样为难老板,人家赚点钱不容易...首先如果你是高手那么请出门右转,如果你是菜鸟那么恭喜你,go on吧 全局对象在javascript程序中任何位置,都可以拈来就用的这种东西,是全局对象的属性.那么属性所在的对象也就是全局对象了.当javascript解释器启动时(或者任何Web浏览器加载新

Javascript的一些小知识点

小弟五一回家去了,本想好好的享受下五一假期,谁知悲剧的人生不需要解释.好不容易过五关斩十将,跨千山趟万水,回到家里.吃着老妈做的好菜,第二天就莫名其妙的急性肠炎,这肚子闹腾的.NND,气死哥了,早知道就不回家了.好了,废话不多说,进入主题. ================ 关于clientHeight.offsetHeight.scrollHeight window.screen.availWidth 返回当前屏幕宽度(空白空间) window.screen.availHeight 返回当前屏

记录神经网络中一些小知识点

记录神经网络中一些小知识点 1 Caffe中的blob维度 Caffe中的blob具有4个维度,分别是num,channel,width和height: 其中我们在定义各个网络层时,常用到的一个参数numout,就是指定的channel: 比如说,维度为1*3*5*5的数据输入网络(即每次输入一张5*5大小的3通道图),经过一个stride为2,pad为1,kernel为2,numout为2的卷积层后,维度就变成了1*2*3*3: 假如输入有n个通道,计算时,caffe就会对应产生n个filte

给Javascript初学者的一点小建议

本文来自e良师益友网 一般初学JavaScript的时候最头痛的就是浏览器兼容问题.在Firefox下面好好的代码放到IE就不能显示了,又或者是在IE能正常显示的代码在firefox又报错了. 如果你正初学JavaScript并有着一样的处境的话建议你:初学JavaScript的时候无视DOM和BOM的兼容性,将更多的时间花在 了解语言本身(ECMAScript).只在特定浏览器编写代码(Chrome/Firefox/Safari),实际工作中使用成熟的 JavaScript框架(jQuery等