精华内容
下载资源
问答
  • 构造函数创建对象时的this的指向问题
    千次阅读
    2014-11-06 15:58:56

    用构造函数方式创建对象:

    function Person(name,age){
    			this.name=name;
    			this.age=age;
    			this.sayname=function(){
    				alert(this.name);
    			};
    		}
    构造函数其实就是用new操作符调用的一个函数。用new时构造函数内部的this会指向新的实例,如:

    var p1=new Person('tom',10);
    此过程中this指向p1,相当于:

    p1.name=name;//name为参数tom
    p1.age=age;//age为参数10

    检测结果:

    alert(p1.name);  //tom
    p1.sayname();<span style="white-space:pre">	</span>//tom

    上述在this的帮助下实现p1的属性。

    那么倘若不用new呢?直接把构造函数当作一个普通函数来直接调用又会有什么情况:

    var p2=Person('tom',10); //直接调用(不适用new)
    检测结果:

    alert(p2.name);//(报错)name is undefined 
    p2.sayname();  //(报错)sayname is undefined
    用以下代码则能正常运行:

    alert(name)//tom
    sayname();//tom
    很明显此时的name和sayname已经不属于p2,而是属于全局window,等同于:

    alert(window.name);
    window.sayname();
    很明显不用new,而采用直接调用的方式this不在代表新的实例p2,而是window,this把name和sayname全放到了全局window中。

    为了确保每次实例化时都能用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:45
    1、 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:16
    java中不通过构造函数创建对象(也有说不创建对象直接执行成员方法) 这里就不和你们扯什么通过 反序列化、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:01
    1构造函数是用new创建对象时调用的函数,与普通唯一的区别是构造函数名应该首字母大写。 function Person() { this.age = 50; } let a = new Person(); console.log(a.age); //50 2构造函数可以接受参数 function ...
  • Java不通过构造函数也能创建对象吗?

    千次阅读 2020-10-22 14:05:20
    Java创建对象的几种方式(重要): 1、用new语句创建对象,这是最常见的创建对象的方法。 2、运用反射手段,调用java....(1)和(2)都会明确的显式的调用构造函数; (3)是在内存上对已有对象的影印,所以不会调用构造函
  • python 类 构造函数 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...
  • 问题:如下两条语句的区别是什么? Student a; Student b(); 假设有一个Student类: class Student { private: int age;... // 不带参数的构造函数 Student() { this->age = 7; } //...
  • 不通过构造函数也能创建对象吗 A. 是 B. 否 答案:A 解析:Java 创建对象的几种方式(重要): (1) 用 new 语句创建对象,这是最常见的创建对象的方法。 (2) 运用反射手段,调用 java.lang.Class 或者 java.l ang.reflect....
  • 构造函数创建对象

    千次阅读 2016-03-27 00:45:30
    1、对象不是构造函数产生的,它只是创建对象过程中的一步,主要作用是完成初始化,设计初衷是为了在函数运行过程中动态初始化,因为有些变量的初始化需要推迟到运行中完成。2、java生成一个对象一定会调用构造
  • 如题 比如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:25
    1.指针不会调用构造和析构函数,只是定义了一个指针,没有申请内存:...使用new创建对象时,申请分配内存,调用构造函数: 当我们使用new为指针开辟空间,然后用delete释放掉空间会分别调用构造和析构函数: ...
  • JS 通过对象字面量{}和构造函数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) 运用反序列化...
  • 创建构造函数带参数的对象数组(构造函数初始化列表) #include<iostream> using namespace std; class node{//声明 public: node(int a,int b); ~node(); void print(); private: int x,y; }; //...
  • 使用无参构造函数创建对象时,不应该在对象名后面加上括号。  例如:  class CText  {  public:  CText(){}  CText(int a, int b, int c)  {  m_nA = a;
  • 类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时...//例程:无参构造函数和有参构造函数创建对象时初始化的使用 #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.....
  • 构造函数  –和类名相同  –没有返回值类型  –只在建立对象的时候被自动调用一次  –调用构造函数的主要目的是初始化对象 •一个对象创建过程:  –分配内存空间 ...构造函数使用构造函数重载
  • 一、问题分析 反射机制 : 指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射...可是,Class类中的newInstance()方法只能创建默认构造器的对象,想要创建有参的构造函数还是要使...
  • 用子类的构造函数创建父类对象

    千次阅读 2019-01-09 13:06:36
    public 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中,一般情况下会使用new关键字来调用类的有参或者无参构造函数来建立一个对象,也可以通过Class.newInstance()方法来调用类的无参构造函数来建立一个对象。而如果一个类的构造函数为private 类型,不是public...
  • 类和对象是 C++ 的重要特性,它们使得 C++ 成为面向对象的编程语言。在C++类的学习当中,有一个用来初始化成员数据的函数即构造函数,本文重点分析的就是构造涵的各种用法和注意事项。
  • 构造函数:专门用于构造新对象、将值赋给它们的数据成员。 由于Stock对象提供3个值,因此应为构造函数提供3个参数。 Stock(const string &co, long n = 0, double pr = 0.0) 第一个参数:指向字符串的指针,...
  • (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

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 959,443
精华内容 383,777
关键字:

使用构造函数创建对象