随笔 - 133  文章 - 1  评论 - 3  阅读 - 47473

JS原型

原型与类

类是一个抽象的,可以构造对象,就是一个抽象到具体的过程。一般用new。


原型:是一个具体到具体的过程。
使用现有的对象,去构造一个新的对象。

有两种方法从原型来构造对象。

(1) Object.create();

Object.create(proto, [propertiesObject])
- proto 一个对象,作为新创建对象的原型。
- properiesObject 对象的属性定义。

每个实例对象都有一个 __proto__属性指向原型,公用其中的方法和属性。
这个属性是一个隐私属性,不可以被修改。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<script type="text/javascript">
    var A = {
        name : 'aaa',
        start : function () {
            console.log('%s start ', this.name);
        },
        end : function () {
            console.log('%s end ', this.name);
        }
    }
 
    var aaa = Object.create(A);
    aaa.start();            <strong>// aaa start</strong>
    aaa.logo = 'first';     //创建新的属性
 
    var bbb = Object.create(A);
    bbb.start();            <strong>// aaa start</strong>
    bbb.logo = 'second';
 
    console.log(aaa.logo + " " + bbb.logo);    <strong>// first second</strong>
 
</script>

 

(2) 构造函数

函数有一个prototype属性。
使用构造函数创建对象,每个对象都有一个原型,就是prototyoe这个属性。
用new创建对象,就是构造函数

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function Person (name) {
    this.name = name;
}
 
Person.prototype = {
    start :function() {
        console.log('%s start', this.name);
    },
    run : function () {
        console.log("%s is running...", this.name);
    }
}
 
var lily = new Person('lily');
var tom = new Person('ton');
 
 
lily.run();     //lily is running...
tom.run();      //ton is running...

 

new 创建一个对象分为三步。
(1)首先,创建一个lily的Person的对象
(2)设置lily的_porto_的这个属性,指向Person.prototype。
(3)Person.call(lily, arguments);使用Person类去初始化lily对象。(看,这里最后还是用call来改变this创建对象的。)

 

型链--实例


对象的原型链从最下层的对象,到最高的Object.prototype,截至。
并且就近原则。找到最近的进行操作。

对象的操作,无论是修改还是删除属性,都不会对原型上面进行影响。


hasOwnProperty:方法,来源于Object.prototype上面。
判断传入的属性是不是对象自身的属性。
传入的属性如果返回时假,要么属性在原型上面,要么不存在。

lily.hasOwnProperty('name'); // true
lily.hasOwnProperty('logo'); // false


函数也是对象 来源于 Function() { }
而Function自己也有_proto_ , 最终指向Object.prototype.

 

posted on   HGonlyWJ  阅读(147)  评论(0编辑  收藏  举报
编辑推荐:
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
阅读排行:
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· 一个基于 .NET 开源免费的异地组网和内网穿透工具
· 《HelloGitHub》第 108 期
· Windows桌面应用自动更新解决方案SharpUpdater5发布
· 我的家庭实验室服务器集群硬件清单
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

W3C中国
阮老师的网络日志
canvas
runoob
迷渡
并发编程网
原生JS例子
前端外刊评论
点击右上角即可分享
微信分享提示