构造函数(方法)

本文介绍了构造函数的概念及其使用方法,包括如何通过构造函数初始化对象属性,并演示了创建对象的不同方式。此外,还展示了如何利用call方法改变函数内部this指向。

1.构造函数
构造函数是一种特殊的方法,它的主要作用是完成对对象实例的初始化。
特点:
(1)构造函数(方法)名和类名相同
(2)在创建一个对象实例时,系统会自动的调用该类的构造方法完成对新对象的初始化。

2.构造函数的基本用法
function 类名(参数列表){
属性=参数值;
}
举例:

function Person(name,age){
    this.name=name;
    this.age=age;
}
//创建Person对象的时候就直接可以给名字,年龄
var p1=new Person('abc',80);
window.alert(p1.name);

3.在给一个对象初始化属性值的时候,也可以指定函数属性。
举例:

function jiSuan(num1,num2,oper){
    if(oper=="+"){
    return num1+num2;   
    }else if(oper=="-"){
        return num1-num2;   
    }else if(oper=="*"){
        return num1*num2;
    }else{
        return num1/num2;
    }
}

    function Person(name,age,fun){
        this.name=name;
        this.age=age;
        this.myfun=fun;
    }   
    var p1=new Person("aa",9,jiSuan);
    window.alert(p1.name);
    window.alert(p1.myfun(70,80,"+"));

4.有了构造函数后,对类(原型对象)的定义就可以进一步完善。

function 类名(){
    属性;
}
function 类名(){
    属性;
    函数(方法);
}
function 类名(参数1,参数2...){
    属性=参数1...
    函数=参数2;
}

5.创建对象的又一种形式
如果一个对象比较简单,我们可以直接创建(可以指定普通属性和函数属性)

var dog={name:'小狗'age:8,fun1:function(){window.alert("hello world")}};
window.alert(dog.constructor);
window.alert(dog.name+dog.age);
dog.fun1();

6.有时我们会看到这样一种调用方法

函数名.call(对象实例);
//这样调用,该函数的this就是对象实例

举例:

var dog={name:'hello'};
function test(){
    window.alert(this.name);
}
test();  //输出undefined
window.test();//输出undfined
test.call(dog);//相当于调用test(),同时this执行dog对象,输出hello
new test(); //输出undfined

7.

var dog={name:'小明',sayHello:function(a,b){window.alert("结果="+(a+b));}};
//循环列出dog对象的所有属性和方法 对象名['属性名']
for(var key in dog){
    window.alert(dog[key]);
}
document.write("***当前浏览器window对象有属性和方法***<br/>");
for(var key in window){
    document.writeln(key+":"+window[key]+"<br/>");
}
### C# 构造函数注入 类中构造函数方法能否被调用 在 C# 中,通过构造函数注入类时,构造函数中的方法可以被调用。构造函数的主要职责是初始化对象的状态,因此可以在构造函数中调用类的方法来完成一些必要的初始化工作[^1]。然而,这种做法需要谨慎处理,以避免潜在的问题。 以下是一个示例,展示如何在构造函数中调用方法: ```csharp public class Service { public void Initialize() { Console.WriteLine("Service initialized."); } } public class Consumer { private readonly Service _service; public Consumer(Service service) { _service = service; InitializeService(); // 在构造函数中调用方法 } private void InitializeService() { _service.Initialize(); } } ``` #### 注意事项 - **对象状态未完全初始化**:在构造函数中调用方法时,需确保对象的状态已经足够稳定,以便方法能够正确执行。如果方法依赖于尚未初始化的字段或属性,可能会导致错误或异常。 - **虚方法调用的风险**:如果在构造函数中调用虚方法(或通过接口调用方法),可能会引发未定义行为,因为基类的构造函数会在派生类的构造函数之前执行,而此时派生类的状态可能尚未初始化[^2]。 - **依赖注入框架的行为**:当使用依赖注入框架时,通常建议将复杂的初始化逻辑移出构造函数,转而在单独的初始化方法中实现。这样可以提高代码的可测试性和可维护性[^3]。 #### 示例:构造函数中调用方法的潜在问题 ```csharp public abstract class Base { public Base() { CallVirtualMethod(); // 调用虚方法 } public virtual void CallVirtualMethod() { Console.WriteLine("Base method called."); } } public class Derived : Base { public override void CallVirtualMethod() { Console.WriteLine("Derived method called."); } } public class Program { public static void Main(string[] args) { var derived = new Derived(); // 输出 "Derived method called" } } ``` 在这个例子中,`Base` 类的构造函数调用了虚方法 `CallVirtualMethod`,但此时 `Derived` 类尚未完全初始化,可能导致意外行为[^2]。 #### 推荐实践 为了避免上述问题,可以采用以下策略: - 将复杂逻辑从构造函数中分离,使用显式的初始化方法。 - 使用依赖注入框架提供的生命周期管理功能,确保对象在其生命周期内正确初始化。 ```csharp public class Consumer { private readonly Service _service; private bool _isInitialized; public Consumer(Service service) { _service = service; } public void Initialize() { if (!_isInitialized) { _service.Initialize(); _isInitialized = true; } } } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值