原型和原型链

博客介绍了构造函数、实例对象和原型对象。构造函数用于创建对象,有this指向实例、存在prototype属性等特点;实例对象通过new构造函数创建,可使用其方法和属性;原型对象存于构造函数的prototype属性中,用于存放公共内容实现继承,还提及三者关系及深入理解继承。

三个重要的点

构造函数

构造函数是我们平常所看到的函数,当任意一个普通函数用于创建一类对象时,它就被称作构造函数。例如人类,动物类....

function Person(name,age){
    this.name=name;
    this.age=age;

//我就是构造函数
}

他有几个特点

1.this指向实例化的对象。

2.存在 prototype原型属性,存放原型对象

3.通过New来实例化对象

4.实例化对象可以获取到构造函数内的值或者方法。

5.构造函数首字母大写用于区分于普通函数

实例对象

通过var per = new Person() new出来的对象就是实例对象

实例出来的对象可以使用构造函数的方法和属性。

function Person(name,age){
    this.name=name;
    this.age=age;
    this.sayHi(){
        console.log('Hi')
}    

//我就是构造函数
}

var per = Person("小明",18)//创建实例对象
console.log(per.name)//小明
console.log(per.sayHi())//Hi
 

原型对象

每一个构造函数都有一个原型属性(prototype),里面存放的对象就是原型对象。

主要用于存放公共的内容,用于继承。

function Person (age) {
    //构造函数
    this.age = age
}
Person.prototype = {
    //构造函数的原型属性。
    this.sex= '男'
    this.sayHi = function () {
        console.log('sayHi')    
    }    
}
var per = Person();//实例对象

console.log(per.age) //实例对象获取了构造函数的内容;
console.log(per.sex); 
per.sayHi()  //实例对象获取了原型的属性和方法
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

实例对象、原型对象和构造函数之间的关系

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

深入理解继承

 

function Person (name, age) {
            //这是构造函数
            this.name = name;
            this.age = age;
            this.sayHi = function () {
                console.log('sayHi')
            }
        }

        Person.prototype.sex = '男' //原型对象  即构造函数的Person.prototype
        Person.prototype.eat = function () {
            console.log('eat')
        }
        var per =new Person('小米',18);//实例化构造函数的对象 ,必须new

        //观察打印内容可以发现原型对象是在__proto__中的,实例对象直接可以看到
        console.log(per)

        //实例对象可以获取构造函数中的属性和方法
        console.log(per.name)
        console.log(per.age)
        per.sayHi()

        //实例对象可以获取到原型对象的值和方法
        console.log(per.sex)
        per.eat();

    //通过原型链实现简单的继承。
        function Student () {}

        //这一行的意思是Student的原型指向变成了new Person() 的实例对象。可以访问到实例对象能访问到的所有。例如构造函数的属性和原型对象的属性
        Student.prototype = new Person('小白',20)
        var stu = new Student();
        console.log(stu.name)//小白
        stu.eat()//eat因为是原型方法


        //如果换成这样那么Student指向Person的原型对象。原型对象中没有构造函数的属性,所以不能获取构造函数的属性,只能后去到原型对象中的属性
        Student.prototype = Person.prototype
        var stu = new Student();
        console.log(stu.name)//undefined
        stu.eat()//eat因为是原型方法

        //改变函数的指向
        // 如果在函数原型改变指向之前赋予函数原型,那并灭有什么卵用,必须在改变指向后赋值(属性函数)

    


        //使用原型实现继承的缺陷在于由于实例化了对象Person所以接下来获取的name,age都是固定值,都是小白和20,所以就需要借用构造函数来继承
    

    //借用构造函数继承。
        function Student1 (name, age, scorce) {
            this.scorce = scorce;
            Person.call(this, name, age)
        }

        var stu1 = new Student1 ('13',13,13)
        var stu2 = new Student1 ('23',23,23)
        var stu3 = new Student1 ('33',33,33)

        console.log(stu1.name,stu1.age,stu1.scorce)
        console.log(stu2.name,stu2.age,stu2.scorce)
        console.log(stu3.name,stu3.age,stu3.scorce)

        stu1.sayHi()//可以使用到构造函数中的方法,但是无法使用到原型函数中的方法(stu1.eat())

        //所以借用函数继承的缺陷在于无法使用到原型函数中的方法


    //试想可不可以用借用构造函数和原型来实现一个完美的继承?
        function Student2 (name, age, scorce) {
            this.scorce = scorce;
            Person.call(this, name, age)
        }
        //赋值的时候,原型对象内容一样,所以可以获取到原型对象的内容。
        Student2.prototype = Person.prototype

        var stu11 = new Student2 ('13',13,13)
        var stu21 = new Student2 ('23',23,23)
        var stu31 = new Student2 ('33',33,33)

        console.log(stu11.name,stu11.age,stu11.scorce)
        console.log(stu21.name,stu21.age,stu21.scorce)
        console.log(stu31.name,stu31.age,stu31.scorce)

        stu11.sayHi()
        stu11.eat()

 

下载方式:https://pan.quark.cn/s/a4b39357ea24 布线问题(分支限界算法)是计算机科学电子工程领域中一个广为人知的议题,它主要探讨如何在印刷电路板上定位两个节点间最短的连接路径。 在这一议题中,电路板被构建为一个包含 n×m 个方格的矩阵,每个方格能够被界定为可通行或不可通行,其核心任务是定位从初始点到最终点的最短路径。 分支限界算法是处理布线问题的一种常用策略。 该算法与回溯法有相似之处,但存在差异,分支限界法仅需获取满足约束条件的一个最优路径,并按照广度优先或最小成本优先的原则来探索解空间树。 树 T 被构建为子集树或排列树,在探索过程中,每个节点仅被赋予一次成为扩展节点的机会,且会一次性生成其全部子节点。 针对布线问题的解决,队列式分支限界法可以被采用。 从起始位置 a 出发,将其设定为首个扩展节点,并将与该扩展节点相邻且可通行的方格加入至活跃节点队列中,将这些方格标记为 1,即从起始方格 a 到这些方格的距离为 1。 随后,从活跃节点队列中提取队首节点作为下一个扩展节点,并将与当前扩展节点相邻且未标记的方格标记为 2,随后将这些方格存入活跃节点队列。 这一过程将持续进行,直至算法探测到目标方格 b 或活跃节点队列为空。 在实现上述算法时,必须定义一个类 Position 来表征电路板上方格的位置,其成员 row col 分别指示方格所在的行列。 在方格位置上,布线能够沿右、下、左、上四个方向展开。 这四个方向的移动分别被记为 0、1、2、3。 下述表格中,offset[i].row offset[i].col(i=0,1,2,3)分别提供了沿这四个方向前进 1 步相对于当前方格的相对位移。 在 Java 编程语言中,可以使用二维数组...
源码来自:https://pan.quark.cn/s/a4b39357ea24 在VC++开发过程中,对话框(CDialog)作为典型的用户界面组件,承担着与用户进行信息交互的重要角色。 在VS2008SP1的开发环境中,常常需要满足为对话框配置个性化背景图片的需求,以此来优化用户的操作体验。 本案例将系统性地阐述在CDialog框架下如何达成这一功能。 首先,需要在资源设计工具中构建一个新的对话框资源。 具体操作是在Visual Studio平台中,进入资源视图(Resource View)界面,定位到对话框(Dialog)分支,通过右键选择“插入对话框”(Insert Dialog)选项。 完成对话框内控件的布局设计后,对对话框资源进行保存。 随后,将着手进行背景图片的载入工作。 通常有两种主要的技术路径:1. **运用位图控件(CStatic)**:在对话框界面中嵌入一个CStatic控件,并将其属性设置为BST_OWNERDRAW,从而具备自主控制绘制过程的权限。 在对话框的类定义中,需要重写OnPaint()函数,负责调用图片资源并借助CDC对象将其渲染到对话框表面。 此外,必须合理处理WM_CTLCOLORSTATIC消息,确保背景图片的展示不会受到其他界面元素的干扰。 ```cppvoid CMyDialog::OnPaint(){ CPaintDC dc(this); // 生成设备上下文对象 CBitmap bitmap; bitmap.LoadBitmap(IDC_BITMAP_BACKGROUND); // 获取背景图片资源 CDC memDC; memDC.CreateCompatibleDC(&dc); CBitmap* pOldBitmap = m...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值