问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

java 没有new 需要初始化类么

发布网友 发布时间:2022-04-23 06:42

我来回答

3个回答

懂视网 时间:2022-04-23 11:04

这次给大家带来无new构建详解,使用无new构建的注意事项有哪些,下面就是实战案例,一起来看一下。

前言

当我们想要创建一个对象,我们可能使用new方法去构建一个对象,那按道理jquery也是一个对象,应该也是用new jquery()来构建呀为什么我们创建jquery对象不用new jquery()而是直接使用类似$(ele)的方式去构建出来一个jquery对象呢?其实内部还是使用了new来构建的,只是jquery内部帮我们构建了而已,请看下面代码

function Jquery(selector, context) {
 return new Jquery(selector, context);
 }
 Jquery.prototype = {
 version:'1.01'
 }

直接这样内部使用new来构建Jquery,很明显是有问题的,这样的话就形成了死循环。为了解决死循环的问题,请看下面代码:

function Jquery(selector, context) {
 return Jquery.prototype.init(selector, context);
}
Jquery.prototype = {
 version:'1.01',
 init: function () {
 this.name = "lin";
 return this;
 }
}
var a = Jquery();
var b = Jquery();
console.log(a.version); //1.01
console.log(a.name); //lin
a.name = "na";
console.log(b.name); //na

死循环的问题确实解决了,但是又发现了新的问题,可以看到a和b两个对象的属性是公用的,我修改a.name属性为na,b.name属性也跟着变为了na,其原因就是this都是指向Jquery的

为了解决这个问题,我们可以每次调用Jquery()的时候都构建一个新的对象,改进代码如下:

function Jquery(selector, context) {
 return new Jquery.prototype.init(selector, context); //注意看,这里多了个new
}
Jquery.prototype = {
 version:'1.01',
 init: function () {
 this.name = "lin";
 console.log(this);
 return this;
 }
}
var a = Jquery();
var b = Jquery();
console.log(a.version); //undefined
console.log(a.name); //lin
a.name = "na";
console.log(b.name); //na

这样处理之后,属性共享的问题已经解决了,每个对象都有各自的属性,可以自由修改,每个对象互不影响,但是又又又发现了新的问题,可以看到我们控制台打印a.version这个属性的时候是读取不到这个属性的,原因就在于此时Jquery.prototypeJquery.prototype.init.prototype是互不相干的,我们创建的是Jquery.prototype.init对象,所以只能读到Jquery.prototype.init.prototype上的属性而读取不到Jquery.prototype上的属性的(该例指version这个属性),解决办法很简单,就是把Jquery.prototype赋值给Jquery.prototype.init.prototype,这样就相当于把Jquery原型上的属性全部赋值到了Jquery.init的原型上,请看下面代码:

function Jquery(selector, context) {
 return new Jquery.prototype.init(selector, context);
}
Jquery.prototype = {
 version:'1.01',
 init: function () {
 this.name = "lin";
 return this;
 }
}
Jquery.prototype.init.prototype = Jquery.prototype; //画龙点睛之笔
var a = Jquery();
var b = Jquery();
console.log(a.version); //1.01
console.log(a.name); //lin
a.name = "na";
console.log(b.name); //na

可以看到,我们控制台打印a对象的version属性,已经可以读取并且打印出来了。

至此,已经完成了Jquery的无new构建。

ps:jQuery.fn其实就是jQuery的prototype,jquery源码可以看到该条语句:jQuery.fn = jQuery.prototype = {};

  $()和jquery()其实是一样的,jquery源码可以看到该条语句: window.jQuery = window.$ = jQuery;

原型 prototype

认识一下什么是原型?

在JavaScript中,原型也是一个对象,通过原型可以实现对象的属性继承,JavaScript的对象中都包含了一个" [[Prototype]]"内部属性,这个属性所对应的就是该对象的原型。

对于"prototype"和"proto"这两个属性有的时候可能会弄混,"Person.prototype"和"Person.proto"是完全不同的。

在这里对"prototype"和"proto"进行简单的介绍:

对于所有的对象,都有proto属性,这个属性对应该对象的原型

对于函数对象,除了proto属性之外,还有prototype属性,当一个函数被用作构造函数来创建实例时,该函数的prototype属性值将被作为原型赋值给所有对象实例(也就是设置实例的proto属性)

function Person(name, age){
this.name = name;
this.age = age;
}
Person.prototype.getInfo = function(){
console.log(this.name + " is " + this.age + " years old");
};
//调用
var will = new Person("Will", 28);
will.getInfo();//"Will is 28 years old"

相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

推荐阅读:

两个zTree怎样互相联动

怎样用webpack写jquery的环境配置

jackson解析json串时大小写自动转换的方法

jQuery EasyUI 折叠面板的使用

热心网友 时间:2022-04-23 08:12

您好,提问者:

    1、使用对象必须new,但是有中特殊情况,看第2条。

    2、如果这个类中有static静态的话就类名.直接调用,不需要new。

    代码示例:

public class Test{
    public static void main(String[] args){
        A a = new A();
        a.add();
        
        A.delete();
    }
}
class A{
    public void add(){
        System.out.println("无静态,必须new才能调用到我");
    }
    public static void delete(){
        System.out.println("我是静态的,直接A.delete()就可以调用到我");
    }
}

热心网友 时间:2022-04-23 09:30

没明白你意思
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
word文档怎么设置页码word怎么从中间开始设置页码 《祖宗模拟器》如何长寿长寿技巧分享 祖宗模拟器答案大全,你知道吗。 祖宗模拟器答案大全,哪位有? 宝石种类分为哪几类? 表格怎么自动排序号excel表格中自动生成序号技巧 表格如何自动排序仅需4步让Excel表格自动排序的方法 1.5匹富士空调电脑板开机就烧保险丝 为什么 修空调只是把拆了个压敏电阻,虽然可以运行,但这样没问题吗? 1.5富士空调电脑板一通电就烧保险丝为什么 论文里有没有必要加发展史和未来趋势? 什么叫产品的购销合同? 以社会的发展趋势为题,写一篇议论文 对于大学生网络消费研究论文中国内外研究现状和发展趋势怎么写 成长,因冒险而精彩450字作文 谈发展趋势的论文如何进行答辩? 中山大信新都汇 中山大信真冰溜冰场多少钱一个小时? 中山市石岐区老安山新村南安路20号 大信新都汇 作文 成长 因什么而精彩 600字 中山石岐区大信南路2号大信新都汇5楼是哪里? 中山大信 中山市大信新都汇商业投资有限公司怎么样? 中山市大信实业投资有限公司怎么样? 服务器病毒防护方法? 为什么门打不开而且没有东西_挡 用云备份能备份手机拍摄的视频吗?是不是只能备份三十天? 成长,因快乐而精彩850字作文 初三作文 成长因_而精彩 600字 猪皮如何才能存放十年? 标致508一键升窗怎么一定要长按 标志新款508仪表盘的4个按键是什么 标志508驾驶座最左边三个按钮 标志508怎么回复车窗一键升降 标致508后备箱手动开关在哪? 标致508车内各项调节都怎么用 标志508的S按钮作用是什么,不要长篇大论的说了。 是提速变快还是怎么?? 标志508里边auto 是什么 怎么用迅雷下载电影超极详细 92加95汽油会怎么样 员工入股和投资入股如何同时处理 蚂蚁你真了不起作文350个字 大学生“寒假十课”知识导图? 网名温暖阳光好吗? 小米盒子可以看翡翠台吗 寒假十课有后台记录吗 阳光的我,网名好吗 冬日阳光、这个网名好不好 寒假十课怎么做 翻越阳光做网名好不好?