实例化的两种方法(new和函数法)

本文介绍了JavaScript中构造函数和原型的使用方法。通过具体示例展示了如何定义构造函数及其实例化过程,并解释了原型链查找机制。同时,还提供了一种自定义new操作符实现对象创建的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// 定义类 类名字是 classA 
function classA(){  
    this.b=1; 

classA.prototype.b=44; 
classA.prototype.show = function(){ 
    alert(this.b); 
}; 
// 用new实例化 
var b = new classA(); 
b.show();  //11没有this.b=1的话输出为44(现在构造函数里面找没找到再到原型上面找)
// 用函数实例化 
function newClass(cls,args){ 
    var obj = {}; 
    for(var p in cls.prototype) 
        obj[p] = cls.prototype[p]; 
    obj.__proto__ = cls.prototype; 
    cls.apply(obj,args||[]); 
    return obj; 
}; 
var k = newClass(classA); 
k.show(); 

转载于:https://www.cnblogs.com/cdwp8/p/4039610.html

### Python 类实例化过程 在 Python 中,类的实例化是指通过已定义好的类来创建具体的对象的过程。这一过程中涉及的关键部分包括 `__init__()` 方法其他内置机制。 #### 1. **`__new__()` `__init__()` 的作用** - 当一个类被实例化时,Python 首先会调用 `__new__()` 方法来分配内存并返回一个新的对象[^1]。 - 返回的新对象随后会被传递给 `__init__()` 方法作为第一个参数(即 `self`)。在这个阶段,初始化工作会在 `__init__()` 方法中完成,比如设置初始状态或绑定属性到新创建的对象上[^1]。 #### 2. **示例代码展示** 下面是一段简单的例子展示了如何定义一个具有基本功能的学生类,并对其进行实例化: ```python class Student: def __init__(self, name, age, school): self.name = name # 学生姓名 self.age = age # 年龄 self.school = school # 所在学校 def print_info(self): """打印学生的个人信息""" print(f"Name: {self.name}, Age: {self.age}, School: {self.school}") @classmethod def get_default_school(cls): """获取默认学校名称""" return "NoSchool" # 创建Student类的一个实例 student_instance = Student("Alice", 20, "XYZ University") # 调用实例方法 student_instance.print_info() ``` 这段代码说明了几个要点: - 使用 `__init__()` 初始化学生的名字、年龄所属学校的值; - 定义了一个普通的实例方法 `print_info()` 来显示这些数据; - 还有一个装饰器标记的类方法 `@classmethod`, 可以不依赖具体某个实例而直接由类本身调用来获得某些固定的信息[^2]。 --- ### 如何调用类中的函数? 对于已经成功实例化的对象来说,可以通过点号`.`操作符去访问其内部的方法或者变量。 #### 实例方法调用 如果要调用的是普通实例方法,则只需指定好对应的实例名即可实现正常调用: ```python student_instance.print_info() # 输出结果将是 Name: Alice, Age: 20, School: XYZ University ``` 这里我们看到的就是典型的实例方法调用方式——借助之前建立起来的那个特定个体(student_instance),进而执行其中封装的行为逻辑(print_info())[^1]。 #### 类方法与静态方法调用 除了常规意义上的实例方法之外,在面向对象设计里还存在另外两种特殊的成员形式—类别专属的操作接口(也就是所谓的“类方法)以及完全独立于任何实体存在的辅助工具型服务提供者们(亦称为“静态方法). 关于前者(`@classmethod`),它允许开发者即使没有实际制造出任何一个真实世界的映射物也能顺利完成预期的任务;而对于后者而言(@staticmethod), 则更是进一步摆脱掉了所有跟当前上下文中所关联的具体事物之间的联系约束条件限制. 例如上面提到过的那个用于设定缺省值得getter函数(get_default_school): ```python default_school_name = Student.get_default_school() print(default_school_name) # NoSchool ``` 此处在无需构建任何单独学员记录的前提下就能够轻松取得预设配置项的内容啦! 同样地,@staticmethod也可以按照相似的方式来进行处理只不过由于缺乏隐含接收者的缘故所以在签名定义的时候不需要额外声明诸如cls之类的占位符而已.[^2] --- ### C++环境中对Python类的支持情况简介 值得注意的一点在于跨语言协作场景下同样能够很好地支持这种基于OO思想构建出来的结构体单元。比如说利用嵌入式脚本技术把整个解释引擎集成进去之后就可以很方便地操纵那些预先准备完毕后的外部资源文件里面的组件元素咯~ 下面给出了一小段示范性的片段演示怎样从CPP端发起请求从而激活目标模块内的相应动作响应链路:[^3]: ```cpp // 假定m代表加载成功的module module object pointer. PyObject* type_py_class = PyObject_GetAttrString(m, "TypePy"); if (!type_py_class){ throw std::runtime_error("Failed to retrieve TypePy class."); } // Instantiate the python class equivalent of calling its constructor/__init__ PyObject* instance = PyObject_CallObject(type_py_class, nullptr); if(!instance){ PyErr_Print(); throw std::runtime_error("Instance creation failed."); } // Invoke member function 'test' on newly created python object PyObject_CallMethod(instance,"test",nullptr); // Clean up resources properly after usage completed. Py_DECREF(instance); Py_DECREF(type_py_class); ``` 以上摘录清楚表明即便是在完全不同语体系下的应用程序框架之中依旧可以无缝衔接彼此之间互相配合共同作业的能力表现出来哦~ ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值