-
2014-11-06 15:58:56
用构造函数方式创建对象:
构造函数其实就是用new操作符调用的一个函数。用new时构造函数内部的this会指向新的实例,如:function Person(name,age){ this.name=name; this.age=age; this.sayname=function(){ alert(this.name); }; }
此过程中this指向p1,相当于:var p1=new Person('tom',10);
p1.name=name;//name为参数tom p1.age=age;//age为参数10
检测结果:
上述在this的帮助下实现p1的属性。alert(p1.name); //tom p1.sayname();<span style="white-space:pre"> </span>//tom
那么倘若不用new呢?直接把构造函数当作一个普通函数来直接调用又会有什么情况:
检测结果:var p2=Person('tom',10); //直接调用(不适用new)
用以下代码则能正常运行:alert(p2.name);//(报错)name is undefined p2.sayname(); //(报错)sayname is undefined
很明显此时的name和sayname已经不属于p2,而是属于全局window,等同于:alert(name)//tom sayname();//tom
很明显不用new,而采用直接调用的方式this不在代表新的实例p2,而是window,this把name和sayname全放到了全局window中。alert(window.name); window.sayname();
为了确保每次实例化时都能用new,用构造函数创建对象的方式可改进为:
<span style="white-space:pre"> </span>function Person(name,age){ if(this instanceof Person)//先判断this对象是否为Person的实例 { this.name=name; this.age=age; this.sayname=function(){ alert(this.name); }; } else { return new Person(name,age);//否则用new操作符(调用构造函数)创建新的实例并返回,结果还是使用了new } }
这样无论是否用new调用构造函数,其结果都是用new来调用的。
更多相关内容 -
js 使用构造函数创建对象
2019-08-29 11:25:56一个人称小仙女的妹子和一个苦逼埋头敲代码的程序猿的对话: ...进入正题,上代码,构造函数: function dog(name,age){ this.name=name this.age=age this.changeName=changeName function chan...一个人称小仙女的妹子和一个苦逼埋头敲代码的程序猿的对话:
妹子:你缺对象吗
程序猿:缺对象还不简单么,自己创建一个就好了
妹子:。。。。。。
进入正题,上代码,构造函数:
function dog(name,age){ this.name=name this.age=age this.changeName=changeName function changeName(name){ this.name=name } }
需要注意的是,在使用构造函数创建对象时必须使用 new 关键字。
-
C++中构造函数创建对象
2016-05-02 00:12:451、 C++中构造函数的调用方式主要分为两类: 1)显示调用: eg: Stock food = Stock("360",250,2.5); 2)隐式调用; eg:Stock food("360",250,2.5); 注意:显示调用构造函数大多编译器理解为对food进行初始化,这也...1、 C++中构造函数的调用方式主要分为两类:
1)显示调用:
eg: Stock food = Stock("360",250,2.5);
2)隐式调用;
eg:Stock food("360",250,2.5);
注意:显示调用构造函数大多编译器理解为对food进行初始化,这也是最正确的理解方式,因此直道food所在的作用域到达尽头,才调用析构函数进行清理;而有的编译器将Stock food = Stock("360",250,2.5;理解为:先创建一临时对象,然后将其赋值给food,然后在删除临时对象。如果是这样,则会调用一次析构函数,对对象进行清理。这种创建方式和 food = Stock("360",250,2.5比较相似,即对food进行复位。
C++11新标准,增添了对象的列表初始化:
eg:Stock food = {"360",250,2.5};
eg:Stock food {"360",250,2.5};
2、 默认构造函数:
默认构造函数分为三类:
1)声明类时,程序员不声明任何构造函数,则编译器为该类增添一不含任何参数的构造函数,该构造函数也不对该类的任何成员变量进行初始化,即:成员变量的值未被初始化。
2) 声明类时,程序员声明一个不含参数的构造函数,该构造函数可以对类成员变量进行默认初始化;
3)声明类时,程序员声明一个含默认参数的构造函数,那么定义对象时成员变量将被默认参数初始化;
注意:只有在程序员不声明任何构造函数的情况下,编译器才会为类增添一个不含任何参数的默认构造函数,如果程序员偷懒,定义对象时:Stock food;则编译器将报错,因此为了编译成功,程序员最好为类增添一个隐式初始化的默认构造函数。若添加两个默认构造函数,则在调用默认构造函数初始化对象时会出错,编译器不知道调用哪一个。
3、默认构造函数的调用:
eg: Stack food;
eg: Stack food();//典型错误方法
eg:Stack food = Stack();
默认构造函数写法最简单,因此程序员最好为类增添一个默认构造函数啊!
4、复制构造函数
当时用一个对象类初始化另一个对象时,编译器将自动生成复制构造函数。该函数将生成一个副本对象,并将该副本对象中的非静态数据成员拷贝给要初始化的对象,因此,忽视了对静态成员的处理,容易引发难以检查的错误。
eg: Stock food = Stock("360",250,2.5);
将调用复制构造函数,对food进行复制初始化。
-
java不通过构造函数创建对象(Unsafe)
2020-05-31 17:02:16java中不通过构造函数创建对象(也有说不创建对象直接执行成员方法) 这里就不和你们扯什么通过 反序列化、clone等方法了 个人觉得都是在胡扯。 如何不执行构造函数创建对象? 先来带大家认识一个类 sun.misc.Unsafe...java中不通过构造函数创建对象(也有说不创建对象直接执行成员方法)
这里就不和你们扯什么通过 反序列化、clone等方法了 个人觉得都是在胡扯。
如何不执行构造函数创建对象?
先来带大家认识一个类
sun.misc.Unsafe
该类主要提供一些直接访问系统内存资源等等(学过C语言的应该知道和C语言中的指针一样),但是由于此类能够直接操作内存,这无疑也增加了程序的安全风险。所以技术不是那么好的千万不要在应用中直接使用哟。从上图可以看出 java是不允许直接创建该类对象的,但是我们可以看到第一个红框哪里明显有个Unsafe类的对象,该类是单例的。 那么怎么获取该类的实例呢?
注意:本版较低的jdk可能没有这个方法
有一个getUnsafe()方法,但是很不幸,该方法是提供给jdk内部使用的。我们直接调用该方法会抛异常的。具体原理就是该类会判断当前调用这个方法的类是不是由Bootstrap类加载器加载的。那么如何获取这个Unsafe实例呢?有两种方法
一、让我们使用了Unsafe对象的类通过Bootstrap加载
二、熟悉反射的同学就会心头一冷笑,这还不简单吗?是的,我们可以直接通过反射获取这里只讲通过反射获取的方式
获取Unsafe对象
Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe"); theUnsafe.setAccessible(true); Unsafe unsafe = (Unsafe) theUnsafe.get(null);
java基础好的同学,这段代码应再熟悉不过了
不执行构造函数创建对象?
Unsafe类中有一个
sun.misc.Unsafe#allocateInstance
方法, 接收一个Class<?> 类型对象,然后返回该类的一个对象我们准备一个测试类
class Test{ private String name; public Test(){ System.out.println("test construct"); } }
该类构造方法私有,然后构造方法中打印了一句话,也就是,只要你创建一个新的对象就会打印这句话。
Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe"); theUnsafe.setAccessible(true); Unsafe unsafe = (Unsafe) theUnsafe.get(null); Test test = (Test) unsafe.allocateInstance(Test.class);
测试代码
上面这段代码是没有任何输出的,也就是没有执行构造方法,但是却返回了一个对象
因此也听有人说 压根就没有创建对象, 这我也不好说有没有创建对象,因为对于底层具体怎么实现的我也不造,但是我更倾向于是没有执行构造方法创建对象这种说法吧。
总结以及注意事项
通过这篇文章我们知道原来java中也提供了直接操作内存的类,而且该类还能不执行构造方法就返回一个对象,不过因此也有注意,Unsafe类是直接操作内存的,所以他所分配的内存jvm的垃圾收集器是无法释放的。该类操作的内存和C语言中一样,要手动释放。关于该类的更多使用方式可到网上找相关的资料
推荐阅读:
-
构造函数创建对象
2019-05-28 10:54:011构造函数是用new创建对象时调用的函数,与普通唯一的区别是构造函数名应该首字母大写。 function Person() { this.age = 50; } let a = new Person(); console.log(a.age); //50 2构造函数可以接受参数 function ... -
Java不通过构造函数也能创建对象吗?
2020-10-22 14:05:20Java创建对象的几种方式(重要): 1、用new语句创建对象,这是最常见的创建对象的方法。 2、运用反射手段,调用java....(1)和(2)都会明确的显式的调用构造函数; (3)是在内存上对已有对象的影印,所以不会调用构造函 -
python 类构造函数_Python构造函数创建类对象
2020-07-28 00:37:24python 类 构造函数 Python构造函数创建类对象 (Python Constructors to create a Class Object) In the last tutorial, we learned how to create a class, its instance and how to access class members... -
调用无参构造函数创建对象与函数声明
2018-10-12 22:07:52问题:如下两条语句的区别是什么? Student a; Student b(); 假设有一个Student类: class Student { private: int age;... // 不带参数的构造函数 Student() { this->age = 7; } //... -
面试题:不通过构造函数也能创建对象吗
2018-11-13 18:49:40不通过构造函数也能创建对象吗 A. 是 B. 否 答案:A 解析:Java 创建对象的几种方式(重要): (1) 用 new 语句创建对象,这是最常见的创建对象的方法。 (2) 运用反射手段,调用 java.lang.Class 或者 java.l ang.reflect.... -
构造函数与创建对象
2016-03-27 00:45:301、对象不是构造函数产生的,它只是创建对象过程中的一步,主要作用是完成初始化,设计初衷是为了在函数运行过程中动态初始化,因为有些变量的初始化需要推迟到运行中完成。2、java生成一个对象一定会调用构造 -
java中为什么有的函数不采用 构造函数 创建对象
2017-09-16 09:51:01如题 比如Calendar对象 ,只能采用Calendar.getInstance();来创建对象 而不能采用new Calendar(); 这样做的意义是什么? 谢谢! -
JS构造函数创建对象时的传参问题
2017-03-09 20:35:15当对象属性为字符串时function User(obj){ this.name = obj.name; this.password = obj.password; } var user = new User({ name:"name", password:"password" }); window.onload = function(){ co -
new创建对象是否调用构造函数和析构函数
2019-11-18 19:43:251.指针不会调用构造和析构函数,只是定义了一个指针,没有申请内存:...使用new创建对象时,申请分配内存,调用构造函数: 当我们使用new为指针开辟空间,然后用delete释放掉空间会分别调用构造和析构函数: ... -
JS 通过对象字面量{}和构造函数new创建对象的区别
2019-10-21 14:53:26JS 通过对象字面量{}和构造函数new创建对象的区别通过对象字面量方式{}创建对象通过构造函数new创建对象{}和new创建对象的对比 通过对象字面量方式{}创建对象 可以直接在创建对象的时候添加属性和方法 let person = ... -
Java 创建对象时先调用构造函数
2021-01-25 11:05:10如果类中有成员变量并对成员变量有初始化操作,那么创建构造函数时会先调用构造函数,然后按顺序对成员变量赋值,例如如下代码创建Main对象时 会首先跳到public Main()那一行,然后跳转到 int price = 80;然后按... -
不通过构造函数也能创建对象吗?
2019-06-13 23:10:37(1) 用new语句创建对象,这是最常见的创建对象的方法。 (2) 运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。 (3) 调用对象的clone()方法。 (4) 运用反序列化... -
C++创建构造函数带参数的对象数组(构造函数初始化列表)
2021-07-12 09:42:56创建构造函数带参数的对象数组(构造函数初始化列表) #include<iostream> using namespace std; class node{//声明 public: node(int a,int b); ~node(); void print(); private: int x,y; }; //... -
使用无参构造函数创建对象时,不应该在对象名后面加上括号 等等
2015-03-13 16:26:44使用无参构造函数创建对象时,不应该在对象名后面加上括号。 例如: class CText { public: CText(){} CText(int a, int b, int c) { m_nA = a; -
无参构造函数和有参构造函数在创建对象时初始化的使用
2020-06-30 20:51:09类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时...//例程:无参构造函数和有参构造函数在创建对象时初始化的使用 #include <iostream> #include <cstdio> #include <cmath> usi -
JavaScript——对象构造函数
2019-03-01 18:23:22使用对象字面量创建对象 以前我们都是这做的。使用对象字面量创建对象时,逐个地指定其属性: var car = { make:"habo", model:"cow", year:2019, color:"blue", started:fal..... -
C++中的构造函数与创建对象的(简单)过程
2015-01-19 15:22:59•构造函数 –和类名相同 –没有返回值类型 –只在建立对象的时候被自动调用一次 –调用构造函数的主要目的是初始化对象 •一个对象的创建过程: –分配内存空间 ...构造函数的使用 •构造函数重载 -
Java反射 - 通过反射创建有参与无参构造函数的对象
2019-08-22 14:39:17一、问题分析 反射机制 : 指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射...可是,Class类中的newInstance()方法只能创建默认构造器的对象,想要创建有参的构造函数还是要使... -
用子类的构造函数创建父类对象
2019-01-09 13:06:36public class g { public static void main(String[] ... //获取创建的对象b的类型,运行可以得到其为B类型 System.out.println(b.getClass().getName()); b.A(); b.fun(); b.B();//此处报错,显示The me... -
创建派生类对象,构造函数的执行顺序
2019-04-24 22:04:10在创建派生类对象,构造函数的执行顺序() 正确答案: A A 基类构造函数,派生类对象成员构造函数,派生类本身的构造函数 B 派生类本身的构造函数,基类构造函数,对象成员构造函数 C 基类构造函数,派生类... -
C++(十三)对象数组与构造函数
2020-02-27 19:32:57对象数组中的元素同样需要用构造函数初始化。具体哪些元素用哪些构造函数初始化,取决于定义数组时的写法。 #include<iostream> using namespace std; class CSample{ public: CSample(){ //构造函数 1 cout... -
Java中通过反射为构造函数为private的类创建对象
2018-05-16 10:15:18在Java中,一般情况下会使用new关键字来调用类的有参或者无参构造函数来建立一个对象,也可以通过Class.newInstance()方法来调用类的无参构造函数来建立一个对象。而如果一个类的构造函数为private 类型,不是public... -
C++构造函数的各种用法全面解析(C++初学面向对象编程)
2021-03-19 22:49:27类和对象是 C++ 的重要特性,它们使得 C++ 成为面向对象的编程语言。在C++类的学习当中,有一个用来初始化成员数据的函数即构造函数,本文重点分析的就是构造涵的各种用法和注意事项。 -
类的构造函数和析构函数、默认构造函数
2020-12-15 18:40:01构造函数:专门用于构造新对象、将值赋给它们的数据成员。 由于Stock对象提供3个值,因此应为构造函数提供3个参数。 Stock(const string &co, long n = 0, double pr = 0.0) 第一个参数:指向字符串的指针,... -
不通过构造函数也能创建对象吗()
2018-07-16 17:50:18(1) 用new语句创建对象,这是最常见的创建对象的方法。 (2) 运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。 (3) 调用对象的clone()方法。 (4) 运用反序列化手段,... -
js中的字面量与构造函数创建对象
2015-10-18 23:58:05在使用百度地图JavaScript API中,多次看到类此语句"此类没有构造函数,但可通过对象字面量形式表示"。特此了解下: 一、在JavaScript中没有所谓的空对象,即使最简单的{}也具有从...2.使用内置构造函数创建对象:v