原创作品,转载请注明来源,sogeisetsu,我的csdn上也有这篇文章csdn

js属性,封装性,prototype综合解析

用实例来解释以下js的公有属性,静态属性,实例属性,prototype和封装性

下面是我在写博客的源代码,您可以先不要看他,先看下面的文字部分

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>js属性</title>
<script>
//先构造一个函数
//先搞清楚原型链
function qust() {
this.name="university";//这是公有属性
this.age=12;
//这是共有方法
this.run=function () {
console.log("have ran");
};
let age="12";//这是私有属性
//这是私有方法
function go() {
console.log("have gone");
}
}
//先创建一个实例对象
let shili=new qust();
//构造函数的原型对象通过prototype来调用
console.log(qust.prototype);//打印原型对象,打印结果是object
//注意,这个时候还没有改变原型对象
console.log(qust.prototype.constructor);//打印原型对象的constructor
/*打印结果是如下
ƒ qust() {
this.name="university";//这是公有属性
this.age=12;
//这是共有方法
this.run=function () {
console.log("have ran");
};

* */
console.log(qust);//打印构造函数
/*结果如下
* ƒ qust() {
this.name="university";//这是公有属性
this.age=12;
//这是共有方法
this.run=function () {
console.log("have ran");
};
…*/
console.log(qust === qust.prototype.constructor);//true,原型对象的constructor指向构造函数
//但是,如果我们修改了qust.prototype(原型对象),qust.prototype.constructor还指向构造函数吗?
qust.prototype={//prototype保存一些构造函数共有的属性,来节省内存
type:"人类",
typerun:function () {
console.log('人类');
}
};
console.log(qust === qust.prototype.constructor);//false,不相等了。
// 注意点: 为了不破坏原有的关系, 在给prototype赋值的时候, 需要在自定义的对象中手动的添加constructor属性, 手动的指定需要指向谁
qust.prototype={//prototype保存一些构造函数共有的属性,来节省内存
constructor:qust,//不带括号
setype:"人类",
typerun:function () {
console.log('人类');
}
};
console.log(qust === qust.prototype.constructor);//true
/*
1.对象中__proto__组成的链条我们称之为原型链
2.对象在查找属性和方法的时候, 会先在当前对象查找
如果当前对象中找不到想要的, 会依次去上一级原型对象中查找
如果找到Object原型对象都没有找到, 就会报错
*/
// 放个图就明白了
let shi=new qust();//由于修改了一些东西,所以新创建一个对象
console.log(shi.setype);//打印在原型对象中定义的值,结果是人类
shi.setype="新人类";
console.log(shi.setype);//新人类
console.log(shi.__proto__);/*{setype: "人类", constructor: ƒ, typerun: ƒ}*/
console.log(shi.__proto__.setype);//人类
console.log(qust.prototype.setype);//人类
console.log(shi.__proto__===qust.prototype);//true
// 注意点: 在给一个对象不存在的属性设置值的时候, 不会去原型对象中查找, 如果当前对象没有就会给当前对象新增一个不存在的属性
/*
1.在JavaScript中属性和方法分类两类
1.1实例属性/实例方法
在企业开发中通过实例对象访问的属性, 我们就称之为实例属性
在企业开发中通过实例对象调用的方法, 我们就称之为实例方法
1.2静态属性/静态方法
在企业开发中通过构造函数访问的属性, 我们就称之为静态属性
在企业开发中通过构造函数调用的方法, 我们就称之为静态方法
*/
//先看一下原先设置的qust
/*function qust() {
this.name="university";//这是公有属性
this.age=12;
//这是共有方法
this.run=function () {
console.log("have ran");
};
let age="12";//这是私有属性
//这是私有方法
function go() {
console.log("have gone");
}
}
* */
//上面的属性或方法都是通过创建实例对象才能访问或调用,所以我们叫他实例属性或实例方法
qust.school="qust";//这是一个静态属性,通过构造函数来访问
console.log(qust.school);//qust
//定义一个方法
qust.getschool=function () {
console.log("qust is my school");
}//这是通过构造函数访问的方法,我们称其为静态方法
qust.getschool()//调用静态方法
//qust is my school
//封装性
//防止混乱构造一个新函数newqust
function newqust() {
this.name="university";//这是公有属性
this.age=12;
//以下是修改内容
let myage=19;//设置一个私有年龄,这是在函数外面无法修改的
this.setnewage=function (newage) {
if(newage>=0){
myage=newage;
}
};
//我们还需要一个来调用年龄
this.getage=function () {
return myage;
};
//这是共有方法
this.run=function () {
console.log("have ran");
};
let age="12";//这是私有属性,只能在该函数里访问,在外无法访问,这就为我们的封装性提供了可能
//这是私有方法
function go() {
console.log("have gone");
}
}
//试一下调用私有属性
console.log(newqust.age);//undefined
/*
* 假设一个场景,让用户设置自己的年龄,年龄吗肯定大于零的,但是通过公有属性却而已随意设置*/
let newshili=new newqust();
newshili.age=-2;
console.log(newshili.age);//-2,这是荒诞的
//所以需要修改
newshili.setnewage(15);
console.log(newshili.getage());//15 </script>
</head>
<body> </body>
</html>

先搞清楚原型链,prototype

先构造一个函数

function qust() {
this.name="university";//这是公有属性
this.age=12;
//这是共有方法
this.run=function () {
console.log("have ran");
};
let age="12";//这是私有属性
//这是私有方法
function go() {
console.log("have gone");
}
}

先创建一个实例对象来调用构造函数中的属性

 let shili=new qust();

构造函数的原型对象通过prototype来调用

console.log(qust.prototype);//打印原型对象,打印结果是object

注意,这个时候还没有改变原型对象

console.log(qust.prototype.constructor);//打印原型对象的constructor

qust.prototype.constructor是指向构造函数qust的。


所以

js静态属性,实例属性,封装性,prototype,__proto__综合解析的更多相关文章

  1. Python中类的声明,使用,属性,实例属性,计算属性及继承,重写

    Python中的类的定义以及使用: 类的定义: 定义类 在Python中,类的定义使用class关键字来实现 语法如下: class className: "类的注释" 类的实体 ...

  2. Vue.js Cookbook: 添加实例属性; 👍 axios(4万➕✨)访问API; filters过滤器;

    add instance properties //加上$,防止和已经定义的data,method, computed的名字重复,导致被覆写.//可以自定义添加其他符号. Vue.prototype. ...

  3. python 类中的公有属性 私有属性 实例属性

    class parent(): i=1 __j=2 class child(parent): m=3 __n=4 def __init__(self,age,name): self.age=age s ...

  4. js实例属性和原型属性

    <!DOCTYPE html> <html> <head>     <meta charset="UTF-8">     <t ...

  5. 17 webpack中babel的配置——静态属性与实例属性

    // class关键字,是ES6中提供的新语法,是用来实现ES6中面向对象编程的方式 class Person{ // 使用static关键字,可以定义静态属性 // 所谓的静态属性,就是可以直接通过 ...

  6. Python之路-面向对象&继承和多态&类属性和实例属性&类方法和静态方法

    一.面向对象 编程方式 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强…” 什么是面 ...

  7. Python 进阶_OOP 面向对象编程_实例属性和方法

    目录 目录 构造器和解构器 构造器 __init__ 真构造器 __new__ 解构器 __del__ 实例方法 Python 中的 抽象方法 实例属性 查看实例属性 实例属性和类属性的区别 访问不可 ...

  8. Python中的类属性、实例属性与类方法、静态方法

    1.什么是类对象,实例对象 类对象:类名 实例对象:类创建的对象 2.类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本,这个和C++.Java中类的静态成员变量有点 ...

  9. Python类属性与实例属性理解

    按理讲,类属性改变,类的实例对象这个属性也应该被改变,但是在python中实际却不是这样 class test(): name = 111 a = test() b = test() a.name = ...

随机推荐

  1. 【译】Kubernetes监控实践(2):可行监控方案之Prometheus和Sensu

    本文介绍两个可行的K8s监控方案:Prometheus和Sensu.两个方案都能全面提供系统级的监控数据,帮助开发人员跟踪K8s关键组件的性能.定位故障.接收预警. 拓展阅读:Kubernetes监控 ...

  2. AJAX基础内容

    1.什么是ajax?为什么要使用ajax? ajax是Asynchronous JavaScript and XML ,也称为创建交互式网页应用开发技术. 2.为什么采用ajax 1)通过异步交互,提 ...

  3. select2 分组后的选项无法被选中

    在使用select2组件的过程中发现分组下的选项无法选中,与分组在同一级的选项可以被选中! 1.所用select2版本select2-4.0.32 2.HTML代码: <input id=&qu ...

  4. Java假期样卷 简易通讯录

    score.java package score; public class score { String name; String num; int age; boolean sex; double ...

  5. Spring 梳理 - 视图解析器 VS 视图(View,ViewResolver)

    View View接口表示一个响应给用户的视图,例如jsp文件,pdf文件,html文件等 该接口只有两个方法定义,分别表明该视图的ContentType和如何被渲染 Spring中提供了丰富的视图支 ...

  6. python爬虫——京东评论、jieba分词、wordcloud词云统计

    接上一章,动态页面抓取——抓取京东评论区内容. url=‘https://club.jd.com/comment/productPageComments.action?callback=fetchJS ...

  7. C语言复习————基本数据类型、运算符和表达式

    数据类型/运算符/表达式 主要分两部分介绍,第一部分介绍常用的数据类型,例如:常量和变量/整型/实型/字符型:第二部分介绍算数运算符和算数表达式以及赋值运算符和逗号运算符. 一. 常用的数据类型 1. ...

  8. html5一些特性

    html5可以理解为html+css+js 其目前可以解决:1.浏览器的兼容问题 2.统一web应用标准 3.解决文档结构定义不明确问题 4.解决web应用中的功能受限问题 5.是程序员编写的web应 ...

  9. MySQL 特性:Double Write

    1.什么是double write 首先要明白double write这个特性是针对谁的,日志or脏数据? 明白的是脏数据,是内存中修改后的数据页,这些数据页修改后和磁盘上存储的原数据不一致了,称为脏 ...

  10. ORM查询2

    目录 十三式 2式(针对外键查询优化) select_related和prefetch_related prefetch_related 查询返回值类型 不等式查询 关键字查询 时间查询 跨表查询 组 ...